von Malte Bartels, Anna Brauer, Yuliya Khytrova und Fred Nasser
„‘Jeder soll privat #gendern wie er will, aber ich möchte mich nicht im öffentlich-rechtlichen Rundfunk mit moralischem Zeigefinger belehren lassen, wie ich zu sprechen habe. Wer gibt gebührenfinanzierten Redakteuren das Recht, dafür Anpassungsdruck zu erzeugen?‘ (tm) #Merz #Lanz“ – so lautet ein Tweet von CDU-Politiker Friedrich Merz vom 07.05.2021.
Über das Gendern in der Sprache wird aktuell hitzig diskutiert. Anstelle des generischen Maskulinums werden dabei zur Gleichstellung der Geschlechter entweder alle tatsächlich gemeinten Geschlechter aktiv genannt oder geschlechtsneutrale Begriffe verwendet. Das Beispiel von Friedrich Merz zeigt, dass nicht jede*r mit dieser sprachlichen Anpassung einverstanden ist.
Auch in anderen Bereichen bleibt die fehlende Gleichstellung relevant: Laut Statistischem Bundesamt haben Frauen im Jahr 2020 durchschnittlich 18% weniger Bezahlung erhalten als Männer. Und der Anteil von Frauen in Aufsichtsräten von Unternehmen, die keiner festen Quotenregelung unterliegen, beträgt aktuell nur 19,9% (BMFSFJ).
Die genannten Beispiele zeigen die Aktualität des Themas, weshalb im Rahmen dieses Projekts unterschiedliche Datenanalysen und -visualisierungen durchgeführt wurden, welche sich alle um das Thema Gender in der Politik drehen.
Um zu untersuchen, wie sich die Frauenquote bei den Vertreter:innen der Gesellschaft darstellt, wurde zunächst eine Analyse der Geschlechterverteilung der Fraktionen im Bundestag und in den Landtagen durchgeführt. Außerdem wurde die Geschlechterverteilung der Landtage ohne Fraktionsbezug pro Bundesland untersucht, um einen Ländervergleich zu ermöglichen. Basis für diese Auswertung war der aktuelle DBoeS-Datensatz von “2020 Leibniz-Institut für Medienforschung | Hans-Bredow-Institut” über deutsche Politiker*innen. (Link zum Datensatz: https://github.com/Leibniz-HBI/DBoeS-Automatization/blob/master/LICENSE)
Außerdem wurden Tweets von Politiker*innen zum Thema Gender als Grundlage für eine Sentiment-Analyse verwendet.
Dieser Twitter-Datensatz wurde abschließend eingesetzt, um eine Netzwerkanalyse durchzuführen: Dargestellt wird, welche Politiker*innen durch Retweets miteinander vernetzt sind und sich so aufeinander beziehen.
Load libraries
library(tidytext)
library(tidyverse)
library(quanteda)
library(lubridate)
library(ggplot2)
library(plotly)
library(forcats)
library(readxl)
library(leaflet)
library(leaflet.minicharts)
library(sp)
library(sf)
library(readr)
library(stringr)
library(rtweet)
library(ggraph)
library(ggrepel)
library(tidygraph)
Load Data
Parlamentarier <- read_csv("Data/Parlamentarier.csv")
EU-Parlament rausfiltern
Parlamentarier <- Parlamentarier %>%
filter(Kategorie!="EU-Parlament")
Read Tabellen mit fehlenden Geschlechtern
alle_geschlechter <- read_excel("Data/Parlamentarier_geschechter.xlsx", sheet = "Geschlechter")
Join fehlende Geschlechterangaben
Parlamentarier <- Parlamentarier %>%
left_join(alle_geschlechter, by = c("Name" = "Name"))
Rename Spalten
Parlamentarier <- Parlamentarier %>%
rename(Geschlecht = Geschlecht.y)
Bundestag Geschlechterverteilung pro Partei
- filtern nach Bundestag
- CDU & CSU zusammenfügen
- nach männlich und weiblich gruppieren, Anzahl berechnen und sortieren
bundestag <- Parlamentarier %>%
select(id, Name, Geschlecht, Partei, Kategorie, SM_Twitter_id, SM_Twitter_user) %>%
filter(Kategorie=="Bundestag")
bundestag$Partei[bundestag$Partei == "CSU"] <-"CDU/CSU"
bundestag$Partei[bundestag$Partei=="CDU"]<-"CDU/CSU"
bundestag_man <- bundestag %>%
group_by(Partei) %>%
filter(Geschlecht == "männlich") %>%
summarise(gesamt_man=n())
bundestag_gesamt <- bundestag %>%
group_by(Partei) %>%
filter(Geschlecht == "weiblich") %>%
summarise(gesamt_frau=n()) %>%
left_join(bundestag_man) %>%
mutate(row_sum=rowSums(.[2:3])) %>%
arrange(desc(row_sum))
Joining, by = "Partei"
Verhältnis der Verteilung Männer und Frauen bilden
bundestag_gesamt <- bundestag_gesamt %>%
mutate(verhältnis_man = gesamt_man/row_sum*100,
verhältnis_frau = gesamt_frau/row_sum*100)
Balkendiagramm: Geschlechterverteilung im Bundestag
- Stacked-Barchart zur Geschlechterverteilung im Bundestag pro Partei
- visualisierung der Daten in möglichst geschlechterneuralen Farben
plot_ly(data=bundestag_gesamt, x=~reorder(Partei, -verhältnis_man), y=~verhältnis_frau, name="weiblich", marker=list(color=toRGB("#FB7F62")),
type="bar", hoverinfo="text", text = ~paste("Gesamtanzahl: ", row_sum,
"</br>Anzahl männlich: ", gesamt_man,
"</br>Anzahl weiblich: ", gesamt_frau
),
hovertemplate=paste("Anteil: %{y:,.0f}%",
"<br>%{text}")) %>%
add_trace(y=~verhältnis_man, name="männlich", marker=list(color=toRGB("#775285"))) %>%
layout(barmode="stack", title="Geschlechterverteilung in den Parteien im Bundestag",
xaxis = list(title = ""), yaxis=list(title="Anzahl Abgeordnete")) %>%
layout(legend=list(x=1, y=0.5))
Landtag Geschlechterverteilung pro Partei
- filtern allen Landtagen
- CDU & CSU sowie FDP & DVP zusammenfügen
- nach männlich und weiblich gruppieren, Anzahl berechnen und sortieren
landtag_partei <- Parlamentarier %>%
filter(Kategorie !="Bundestag") %>%
filter(Kategorie!="EU-Parlament") %>%
filter(Partei !="BIW") %>%
filter(Partei!="SSW") %>%
filter(Partei!="BVB/FW") %>%
filter(Partei!="FW")
landtag_partei$Partei[landtag_partei$Partei == "CSU"] <-"CDU/CSU"
landtag_partei$Partei[landtag_partei$Partei=="CDU"] <- "CDU/CSU"
landtag_partei$Partei[landtag_partei$Partei=="FDP/DVP"] <- "FDP"
landtag_man <- landtag_partei %>%
group_by(Partei) %>%
filter(Geschlecht=="männlich") %>%
summarise(gesamt_man=n())
landtag_gesamt <- landtag_partei %>%
group_by(Partei) %>%
filter(Geschlecht=="weiblich") %>%
summarise(gesamt_frau=n()) %>%
left_join(landtag_man) %>%
mutate(row_sum=rowSums(.[2:3])) %>%
arrange(desc(row_sum))
Verhältnis der Verteilung Männer und Frauen bilden
landtag_gesamt <- landtag_gesamt %>%
mutate(verhältnis_man = gesamt_man/row_sum*100,
verhältnis_frau = gesamt_frau/row_sum*100)
Balkendiagramm: Geschlechterverteilung in den Landtagen
- Stacked-Barchart zur Geschlechterverteilung in den Landtagen pro Partei
- visualisierung der Daten in möglichst geschlechterneuralen Farben
plot_ly(data=landtag_gesamt, x=~reorder(Partei, -verhältnis_man), y=~verhältnis_frau, name="weiblich", marker=list(color=toRGB("#FB7F62")),
type="bar", hoverinfo="text", text=~paste("Gesamtanzahl: ", row_sum,
"</br>Anzahl männlich: ", gesamt_man,
"</br>Anzahl weiblich: ", gesamt_frau
),
hovertemplate=paste("Anteil: %{y:,.0f}%",
"<br>%{text}")) %>%
add_trace(y=~verhältnis_man, name="männlich", marker=list(color=toRGB("#775285"))) %>%
layout(barmode="stack", title="Geschlechterverteilung in den Parteien in den Landtagen",
xaxis=list(title=""), yaxis=list(title="Anzahl Abgeordnete")) %>%
layout(legend=list(x=1, y=0.5))
Balkendiagramme: Geschlechterverteilung
Die beiden Balkendiagramme zeigen die aktuelle fraktionsbezogene Geschlechterverteilung in der deutschen Politik – einmal in Bezug auf den Bundestag und einmal hinsichtlich der Landtage. Im zweiten Fall wurden die Abgeordneten aller Landtage addiert, um so einen durchschnittlichen Gesamtüberblick zu ermöglichen.
Für eine bessere Vergleichbarkeit konzentrieren sich beide Darstellungen auf ihre gemeinsame Schnittmenge der Fraktionen. So wird beispielsweise die SSW nicht aufgeführt, da sie nur im Schleswig-Holsteinischen Landtag agiert.
Fraktionen, die in bestimmten Ländern andere Bezeichnungen haben, wurden zusammengefasst (CDU/CSU und FDP/DVP zu FDP).
Im verwendeten Datensatz lagen zwar Informationen zum Geschlecht vor, diese waren jedoch lückenhaft. Fehlende Geschlechtsangaben wurden manuell hinzugefügt, wobei vom üblichen Genus des Namens auf das Geschlecht geschlossen wurde.
Die Höhe der Balken gibt jeweils an, wie viele Abgeordnete die jeweilige Fraktion hat. Der lilafarbene Teil jedes Balkens zeigt die Anzahl der männlichen, der orangene Balken die Zahl der weiblichen Abgeordneten. Hovert man über die Balken, wird die jeweils geschlechtsbezogene Anzahl sowie die Gesamtanzahl der Abgeordneten angezeigt, um eine Einschätzung des Anteils zu ermöglichen.
Es ist erkennbar, dass die AfD sowohl in den Landtagen als auch im Bundestag deutlich mehr männliche Abgeordnete stellt. Eine ebenso auffällige Ungleichheit ist bei der FDP und CDU/CSU zu sehen.
Nahezu ausgeglichen ist dagegen die SPD im Bundestag, ebenso wie Die Linke in den Landtagen. Im Bundestag gibt es bei Die Linke sowie bei den Grünen mehr weibliche als männliche Abgeordnete.
Karte mit Geschlechterverteilung in den Landtagen
- Alle Landtage herausfiltern
parlamentarier_landtag <- Parlamentarier %>%
filter(Kategorie %in% c("Abgeordnetenhaus von Berlin",
"Bayerischer Landtag",
"Bremische Bürgerschaft",
"Hamburgische Bürgerschaft",
"Hessischer Landtag",
"Landtag Brandenburg",
"Landtag des Saarlandes",
"Landtag Mecklenburg-Vorpommern",
"Landtag Nordrhein-Westfalen",
"Landtag Rheinland-Pfalz",
"Landtag Sachsen-Anhalt",
"Landtag von Baden-Württemberg",
"Niedersächsischer Landtag",
"Sächsischer Landtag",
"Schleswig-Holsteinischer Landtag",
"Thüringer Landtag"))
- Vektoren und Dataframe erstellen mit den Koordinaten an denen die späteren Pie-Charts fixiert werden sollen. (Immer genau im Mittelpunkt des Bundeslandes)
Kategorie <- c("Abgeordnetenhaus von Berlin",
"Bayerischer Landtag",
"Bremische Bürgerschaft",
"Hamburgische Bürgerschaft",
"Hessischer Landtag",
"Landtag Brandenburg",
"Landtag des Saarlandes",
"Landtag Mecklenburg-Vorpommern",
"Landtag Nordrhein-Westfalen",
"Landtag Rheinland-Pfalz",
"Landtag Sachsen-Anhalt",
"Landtag von Baden-Württemberg",
"Niedersächsischer Landtag",
"Sächsischer Landtag",
"Schleswig-Holsteinischer Landtag",
"Thüringer Landtag")
lat <- c(52.520008,
48.917431,
53.074982,
53.553815,
50.652052,
52.408418,
49.396423,
53.612651,
51.433237,
50.118346,
51.950265,
48.661604,
52.636704,
51.104541,
54.219367,
51.010989)
lng <- c(13.404954,
11.407980,
8.807080,
9.991575,
9.162438,
12.562492,
7.022961,
12.429595,
7.661594,
7.308953,
11.692274,
9.350134,
9.845077,
13.201738,
9.696117,
10.845346)
bundeslaender_koordinaten <- data.frame(Kategorie, lat, lng)
- Dataframe nach Anzahl der männlichen und weiblichen Politiker*innen pro Bundesland filtern.
parlamentarier_man <- parlamentarier_landtag %>%
group_by(Kategorie) %>%
filter(Geschlecht == "männlich") %>%
summarise(männlich = n())
parlamentarier_landtag_gesamt <- parlamentarier_landtag %>%
group_by(Kategorie) %>%
filter(Geschlecht == "weiblich") %>%
summarise(weiblich = n()) %>%
left_join(parlamentarier_man)
- Koordinaten der späteren Pie-Charts zur Haupttabelle joinen
parlamentarier_koordinaten <- parlamentarier_landtag_gesamt %>%
left_join(bundeslaender_koordinaten, by = c("Kategorie" = "Kategorie"))
Karte mit Tortendiagramm zur Geschlechterverteilung
- geschlechterneutrale Farben für die Geschlechterverteilung erstellen, sowie die Grenzen der Bundesländer importieren und mit Namen versehen (popup).
colors <- c("#FB7F62", "#775285")
grenzen <- readRDS("Data/gadm36_DEU_1_sp.rds") %>%
st_as_sf()
popup_bundeslaender <- paste0("<strong>Bundesland: </strong>", grenzen$NAME_1)
- Pie-Charts mit Hilfe von addMinicharts zur Karte angefügt.
map <- leaflet() %>%
addProviderTiles(providers$CartoDB.VoyagerLabelsUnder) %>%
setView(lng = 10.451526, lat = 51.165691, zoom = 5.5) %>%
addPolygons(data = grenzen,
fillColor = "grey",
fillOpacity = 0.1,
weight = 3,
color = "grey",
popup = popup_bundeslaender) %>%
addMinicharts(
parlamentarier_koordinaten$lng, parlamentarier_koordinaten$lat,
type = "pie",
chartdata = parlamentarier_koordinaten[, c("weiblich", "männlich")],
colorPalette = colors,
width = 46,
height = 46,
opacity = 0.8,
legendPosition = "bottomright"
)
sf layer has inconsistent datum (+proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs).
Need '+proj=longlat +datum=WGS84'
map
Karte mit Geschlechterverteilung in den Landtagen
Die auf der Deutschlandkarte abgebildeten Torten-Diagramme veranschaulichen die Sitzverteilung der Abgeordneten in den deutschen Landesparlamenten aufgeschlüsselt nach der Geschlechterzugehörigkeit (männlichen Abgeordnete, weiblichen Abgeordnete).
Dabei wurde, um den Aspekt der landesspezifischen, aber deutschlandweiten Geschlechterrepräsentanz hervorzuheben, die Fraktionszugehörigkeit der Abgeordneten in der Darstellung nicht berücksichtigt.
Zunächst fällt auf, dass in allen Landesparlamenten mehr männliche Abgeordnete als weibliche Abgeordnete sitzen. Beinahe in jedem Landtag bewegt sich diese ungleiche Sitzverteilung zwischen einer zweidrittel - bis zu einer dreiviertel- Mehrheit an männlichen Abgeordneten.
Einzig die Hamburgische Bürgerschaft weist annähernd ein ausgeglichenes 1-zu-1-Verhältnis zwischen männlichen und weiblichen Abgeordneten auf, wenngleich auch hier die Anzahl der männlichen Abgeordneten leicht überwiegt. Am größten ist die Unausgeglichenheit in Sachsen-Anhalt mit 46 weiblichen Abgeordneten und 83 männlichen Abgeordneten.
Sentimentanalyse
- nach den “großen” Parteien filtern
- alle Politiker*innen entfernen, welche keinen Twitteraccount besitzen
- Usernames in Kleinschreibung formatieren
Parlamentarier_senti <- Parlamentarier %>%
filter(Partei!="BIW") %>%
filter(Partei!="SSW") %>%
filter(Partei!="BVB/FW") %>%
filter(Partei!="FW") %>%
filter(Partei!="fraktionslos") %>%
filter(SM_Twitter_user != "") %>%
select(Name, Partei, SM_Twitter_user, Geschlecht) %>%
mutate(SM_Twitter_user=tolower(SM_Twitter_user))
- CDU & CSU sowie FDP & DVP zusammenfügen
Parlamentarier_senti$Partei[Parlamentarier_senti$Partei == "CSU"] <- "CDU/CSU"
Parlamentarier_senti$Partei[Parlamentarier_senti$Partei == "CDU"] <- "CDU/CSU"
Parlamentarier_senti$Partei[Parlamentarier_senti$Partei == "FDP/DVP"] <- "FDP"
load("Data/sentiWS.RData")
sentiws <- dictionary(list(positive=positive, negative=negative))
- Corpus aus den Texten der gefilterten Tweets bilden
tweet_corpus <- corpus(filtert_tweets, text_field = "text")
- tokenisieren der Texte und bilden einer DFM
- sentiws und “Tweet-Tokens” zusammenführen, sowie nach screen_name gruppieren
token <- tokens(tweet_corpus)
dfm <- dfm(token)
senti <- dfm_lookup(dfm, sentiws)
senti <- dfm_group(senti, groups = screen_name)
- DFM zum Dataframe konvertieren
- doc_id in Kleinschreibung formatieren
- Parlamentarier_senti joinen
- Gruppieren nach Partei
- Sentiment der einzelnen User*innen auf Parteiebene zusammenfassen und Verhältnis positive/negative bilden
senti_frame <- senti %>%
quanteda::convert(to = "data.frame") %>%
as_tibble() %>%
mutate(doc_id=tolower(doc_id)) %>%
rename(negativ = negative, positiv = positive)
senti_final_frame <- senti_frame %>%
full_join(Parlamentarier_senti, by=c("doc_id"="SM_Twitter_user")) %>%
group_by(Partei) %>%
summarise(across(c(negativ, positiv), ~round(sum(., na.rm = TRUE)/sum(negativ + positiv, na.rm = TRUE ), digits = 2)))
Zusammenfassung der Ergebnisse
Zusammenfassend hat die Analyse gezeigt, dass es eine Diskrepanz zwischen der realen Geschlechterverteilung in der Gesellschaft und der Verteilung in der Repräsentation durch die Abgeordneten gibt.
Auch innerhalb der Parteien spielt das Thema Gender eine unterschiedlich große Rolle. Die Fraktionen der Parteien Grüne und Die Linke haben den verhältnismäßig größten Frauenanteil. In der Netzwerkanalyse zeigt sich, dass ebenfalls diese beiden Parteien sehr aktiv an dem Thema beteiligt sind.
Die Sentiment-Analyse hat gezeigt, dass sich die Fraktionen AfD und Die Linke zu 50% negativ und 50% positiv zu dem Thema auf Twitter äußern. Die anderen fünf Parteien melden sich eher positiv.
LS0tDQp0aXRsZTogIkRhdGVuYW5hbHlzZXByb2pla3QgenVtIFRoZW1hIEdlbmRlciBpbiBkZXIgZGV1dHNjaGVuIFBvbGl0aWsiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sgDQotLS0NCiMjIyB2b24gTWFsdGUgQmFydGVscywgQW5uYSBCcmF1ZXIsIFl1bGl5YSBLaHl0cm92YSB1bmQgRnJlZCBOYXNzZXINCg0K4oCe4oCYSmVkZXIgc29sbCBwcml2YXQgI2dlbmRlcm4gd2llIGVyIHdpbGwsIGFiZXIgaWNoIG3DtmNodGUgbWljaCBuaWNodCBpbSDDtmZmZW50bGljaC1yZWNodGxpY2hlbiBSdW5kZnVuayBtaXQgbW9yYWxpc2NoZW0gWmVpZ2VmaW5nZXIgYmVsZWhyZW4gbGFzc2VuLCB3aWUgaWNoIHp1IHNwcmVjaGVuIGhhYmUuIFdlciBnaWJ0IGdlYsO8aHJlbmZpbmFuemllcnRlbiBSZWRha3RldXJlbiBkYXMgUmVjaHQsIGRhZsO8ciBBbnBhc3N1bmdzZHJ1Y2sgenUgZXJ6ZXVnZW4/4oCYICh0bSkgI01lcnogI0xhbnrigJwg4oCTIHNvIGxhdXRldCBlaW4gVHdlZXQgdm9uIENEVS1Qb2xpdGlrZXIgRnJpZWRyaWNoIE1lcnogdm9tIDA3LjA1LjIwMjEuIA0KDQrDnGJlciBkYXMgR2VuZGVybiBpbiBkZXIgU3ByYWNoZSB3aXJkIGFrdHVlbGwgaGl0emlnIGRpc2t1dGllcnQuIEFuc3RlbGxlIGRlcyBnZW5lcmlzY2hlbiBNYXNrdWxpbnVtcyB3ZXJkZW4gZGFiZWkgenVyIEdsZWljaHN0ZWxsdW5nIGRlciBHZXNjaGxlY2h0ZXIgZW50d2VkZXIgYWxsZSB0YXRzw6RjaGxpY2ggZ2VtZWludGVuIEdlc2NobGVjaHRlciBha3RpdiBnZW5hbm50IG9kZXIgZ2VzY2hsZWNodHNuZXV0cmFsZSBCZWdyaWZmZSB2ZXJ3ZW5kZXQuIERhcyBCZWlzcGllbCB2b24gRnJpZWRyaWNoIE1lcnogemVpZ3QsIGRhc3MgbmljaHQgamVkZSpyIG1pdCBkaWVzZXIgc3ByYWNobGljaGVuIEFucGFzc3VuZyBlaW52ZXJzdGFuZGVuIGlzdC4gDQoNCkF1Y2ggaW4gYW5kZXJlbiBCZXJlaWNoZW4gYmxlaWJ0IGRpZSBmZWhsZW5kZSBHbGVpY2hzdGVsbHVuZyByZWxldmFudDogTGF1dCBTdGF0aXN0aXNjaGVtIEJ1bmRlc2FtdCBoYWJlbiBGcmF1ZW4gaW0gSmFociAyMDIwIGR1cmNoc2Nobml0dGxpY2ggMTglIHdlbmlnZXIgQmV6YWhsdW5nIGVyaGFsdGVuIGFscyBNw6RubmVyLiBVbmQgZGVyIEFudGVpbCB2b24gRnJhdWVuIGluIEF1ZnNpY2h0c3LDpHRlbiB2b24gVW50ZXJuZWhtZW4sIGRpZSBrZWluZXIgZmVzdGVuIFF1b3RlbnJlZ2VsdW5nIHVudGVybGllZ2VuLCBiZXRyw6RndCBha3R1ZWxsIG51ciAxOSw5JSAoQk1GU0ZKKS4gDQoNCkRpZSBnZW5hbm50ZW4gQmVpc3BpZWxlIHplaWdlbiBkaWUgQWt0dWFsaXTDpHQgZGVzIFRoZW1hcywgd2VzaGFsYiBpbSBSYWhtZW4gZGllc2VzIFByb2pla3RzIHVudGVyc2NoaWVkbGljaGUgRGF0ZW5hbmFseXNlbiB1bmQgLXZpc3VhbGlzaWVydW5nZW4gZHVyY2hnZWbDvGhydCB3dXJkZW4sIHdlbGNoZSBzaWNoIGFsbGUgdW0gZGFzIFRoZW1hIEdlbmRlciBpbiBkZXIgUG9saXRpayBkcmVoZW4uIA0KDQpVbSB6dSB1bnRlcnN1Y2hlbiwgd2llIHNpY2ggZGllIEZyYXVlbnF1b3RlIGJlaSBkZW4gVmVydHJldGVyOmlubmVuIGRlciBHZXNlbGxzY2hhZnQgZGFyc3RlbGx0LCB3dXJkZSB6dW7DpGNoc3QgZWluZSBBbmFseXNlIGRlciBHZXNjaGxlY2h0ZXJ2ZXJ0ZWlsdW5nIGRlciBGcmFrdGlvbmVuIGltIEJ1bmRlc3RhZyB1bmQgaW4gZGVuIExhbmR0YWdlbiBkdXJjaGdlZsO8aHJ0LiBBdcOfZXJkZW0gd3VyZGUgZGllIEdlc2NobGVjaHRlcnZlcnRlaWx1bmcgZGVyIExhbmR0YWdlIG9obmUgRnJha3Rpb25zYmV6dWcgcHJvIEJ1bmRlc2xhbmQgdW50ZXJzdWNodCwgdW0gZWluZW4gTMOkbmRlcnZlcmdsZWljaCB6dSBlcm3DtmdsaWNoZW4uIEJhc2lzIGbDvHIgZGllc2UgQXVzd2VydHVuZyB3YXIgZGVyIGFrdHVlbGxlIERCb2VTLURhdGVuc2F0eiB2b24g4oCcMjAyMCBMZWlibml6LUluc3RpdHV0IGbDvHIgTWVkaWVuZm9yc2NodW5nIHwgSGFucy1CcmVkb3ctSW5zdGl0dXQiIMO8YmVyIGRldXRzY2hlIFBvbGl0aWtlcippbm5lbi4gKExpbmsgenVtIERhdGVuc2F0ejogaHR0cHM6Ly9naXRodWIuY29tL0xlaWJuaXotSEJJL0RCb2VTLUF1dG9tYXRpemF0aW9uL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpICANCg0KQXXDn2VyZGVtIHd1cmRlbiBUd2VldHMgdm9uIFBvbGl0aWtlcippbm5lbiB6dW0gVGhlbWEgR2VuZGVyIGFscyBHcnVuZGxhZ2UgZsO8ciBlaW5lIFNlbnRpbWVudC1BbmFseXNlIHZlcndlbmRldC4gDQoNCkRpZXNlciBUd2l0dGVyLURhdGVuc2F0eiB3dXJkZSBhYnNjaGxpZcOfZW5kIGVpbmdlc2V0enQsIHVtIGVpbmUgTmV0endlcmthbmFseXNlIGR1cmNoenVmw7xocmVuOiBEYXJnZXN0ZWxsdCB3aXJkLCB3ZWxjaGUgUG9saXRpa2VyKmlubmVuIGR1cmNoIFJldHdlZXRzIG1pdGVpbmFuZGVyIHZlcm5ldHp0IHNpbmQgdW5kIHNpY2ggc28gYXVmZWluYW5kZXIgYmV6aWVoZW4uIA0KDQojIyMgTG9hZCBsaWJyYXJpZXMgDQoNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dGV4dCkgDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocXVhbnRlZGEpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShmb3JjYXRzKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGxlYWZsZXQpDQpsaWJyYXJ5KGxlYWZsZXQubWluaWNoYXJ0cykNCmxpYnJhcnkoc3ApDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkocnR3ZWV0KQ0KbGlicmFyeShnZ3JhcGgpDQpsaWJyYXJ5KGdncmVwZWwpDQpsaWJyYXJ5KHRpZHlncmFwaCkNCmBgYA0KDQojIyMgTG9hZCBEYXRhIA0KDQpgYGB7cn0NClBhcmxhbWVudGFyaWVyIDwtIHJlYWRfY3N2KCJEYXRhL1BhcmxhbWVudGFyaWVyLmNzdiIpDQpgYGANCg0KRVUtUGFybGFtZW50IHJhdXNmaWx0ZXJuDQpgYGB7cn0NClBhcmxhbWVudGFyaWVyIDwtIFBhcmxhbWVudGFyaWVyICU+JSANCiAgZmlsdGVyKEthdGVnb3JpZSE9IkVVLVBhcmxhbWVudCIpDQpgYGANCg0KUmVhZCBUYWJlbGxlbiBtaXQgZmVobGVuZGVuIEdlc2NobGVjaHRlcm4NCmBgYHtyfQ0KYWxsZV9nZXNjaGxlY2h0ZXIgPC0gcmVhZF9leGNlbCgiRGF0YS9QYXJsYW1lbnRhcmllcl9nZXNjaGVjaHRlci54bHN4Iiwgc2hlZXQgPSAiR2VzY2hsZWNodGVyIikNCmBgYA0KDQpKb2luIGZlaGxlbmRlIEdlc2NobGVjaHRlcmFuZ2FiZW4gDQpgYGB7cn0NClBhcmxhbWVudGFyaWVyIDwtIFBhcmxhbWVudGFyaWVyICU+JSANCiAgbGVmdF9qb2luKGFsbGVfZ2VzY2hsZWNodGVyLCBieSA9IGMoIk5hbWUiID0gIk5hbWUiKSkNCmBgYA0KDQpSZW5hbWUgU3BhbHRlbg0KYGBge3J9DQpQYXJsYW1lbnRhcmllciA8LSBQYXJsYW1lbnRhcmllciAlPiUgDQogIHJlbmFtZShHZXNjaGxlY2h0ID0gR2VzY2hsZWNodC55KQ0KYGBgDQoNCiMjIyBCdW5kZXN0YWcgR2VzY2hsZWNodGVydmVydGVpbHVuZyBwcm8gUGFydGVpDQoNCiogZmlsdGVybiBuYWNoIEJ1bmRlc3RhZw0KKiBDRFUgJiBDU1UgenVzYW1tZW5mw7xnZW4gDQoqIG5hY2ggbcOkbm5saWNoIHVuZCB3ZWlibGljaCBncnVwcGllcmVuLCBBbnphaGwgYmVyZWNobmVuIHVuZCBzb3J0aWVyZW4NCmBgYHtyfQ0KYnVuZGVzdGFnIDwtIFBhcmxhbWVudGFyaWVyICU+JSANCiAgc2VsZWN0KGlkLCBOYW1lLCBHZXNjaGxlY2h0LCBQYXJ0ZWksIEthdGVnb3JpZSwgU01fVHdpdHRlcl9pZCwgU01fVHdpdHRlcl91c2VyKSAlPiUgDQogIGZpbHRlcihLYXRlZ29yaWU9PSJCdW5kZXN0YWciKQ0KDQpidW5kZXN0YWckUGFydGVpW2J1bmRlc3RhZyRQYXJ0ZWkgPT0gIkNTVSJdIDwtIkNEVS9DU1UiDQpidW5kZXN0YWckUGFydGVpW2J1bmRlc3RhZyRQYXJ0ZWk9PSJDRFUiXTwtIkNEVS9DU1UiDQoNCmJ1bmRlc3RhZ19tYW4gPC0gYnVuZGVzdGFnICU+JSANCiAgZ3JvdXBfYnkoUGFydGVpKSAlPiUgDQogIGZpbHRlcihHZXNjaGxlY2h0ID09ICJtw6RubmxpY2giKSAlPiUgDQogIHN1bW1hcmlzZShnZXNhbXRfbWFuPW4oKSkNCg0KYnVuZGVzdGFnX2dlc2FtdCA8LSBidW5kZXN0YWcgJT4lIA0KICBncm91cF9ieShQYXJ0ZWkpICU+JSANCiAgZmlsdGVyKEdlc2NobGVjaHQgPT0gIndlaWJsaWNoIikgJT4lIA0KICBzdW1tYXJpc2UoZ2VzYW10X2ZyYXU9bigpKSAlPiUgDQogIGxlZnRfam9pbihidW5kZXN0YWdfbWFuKSAlPiUgDQogIG11dGF0ZShyb3dfc3VtPXJvd1N1bXMoLlsyOjNdKSkgJT4lIA0KICBhcnJhbmdlKGRlc2Mocm93X3N1bSkpDQpgYGANCg0KVmVyaMOkbHRuaXMgZGVyIFZlcnRlaWx1bmcgTcOkbm5lciB1bmQgRnJhdWVuIGJpbGRlbg0KYGBge3J9DQpidW5kZXN0YWdfZ2VzYW10IDwtIGJ1bmRlc3RhZ19nZXNhbXQgJT4lIA0KICBtdXRhdGUodmVyaMOkbHRuaXNfbWFuID0gZ2VzYW10X21hbi9yb3dfc3VtKjEwMCwgDQogICAgICAgICB2ZXJow6RsdG5pc19mcmF1ID0gZ2VzYW10X2ZyYXUvcm93X3N1bSoxMDApIA0KYGBgDQoNCg0KIyMgQmFsa2VuZGlhZ3JhbW06IEdlc2NobGVjaHRlcnZlcnRlaWx1bmcgaW0gQnVuZGVzdGFnDQoNCiogU3RhY2tlZC1CYXJjaGFydCB6dXIgR2VzY2hsZWNodGVydmVydGVpbHVuZyBpbSBCdW5kZXN0YWcgcHJvIFBhcnRlaQ0KKiB2aXN1YWxpc2llcnVuZyBkZXIgRGF0ZW4gaW4gbcO2Z2xpY2hzdCBnZXNjaGxlY2h0ZXJuZXVyYWxlbiBGYXJiZW4NCmBgYHtyfQ0KcGxvdF9seShkYXRhPWJ1bmRlc3RhZ19nZXNhbXQsIHg9fnJlb3JkZXIoUGFydGVpLCAtdmVyaMOkbHRuaXNfbWFuKSwgeT1+dmVyaMOkbHRuaXNfZnJhdSwgbmFtZT0id2VpYmxpY2giLCBtYXJrZXI9bGlzdChjb2xvcj10b1JHQigiI0ZCN0Y2MiIpKSwNCiAgICAgICAgdHlwZT0iYmFyIiwgaG92ZXJpbmZvPSJ0ZXh0IiwgdGV4dCA9IH5wYXN0ZSgiR2VzYW10YW56YWhsOiAiLCByb3dfc3VtLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8L2JyPkFuemFobCBtw6RubmxpY2g6ICIsIGdlc2FtdF9tYW4sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvYnI+QW56YWhsIHdlaWJsaWNoOiAiLCBnZXNhbXRfZnJhdQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgIGhvdmVydGVtcGxhdGU9cGFzdGUoIkFudGVpbDogJXt5OiwuMGZ9JSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+JXt0ZXh0fSIpKSAlPiUgDQogIGFkZF90cmFjZSh5PX52ZXJow6RsdG5pc19tYW4sIG5hbWU9Im3DpG5ubGljaCIsIG1hcmtlcj1saXN0KGNvbG9yPXRvUkdCKCIjNzc1Mjg1IikpKSAlPiUgDQogIGxheW91dChiYXJtb2RlPSJzdGFjayIsIHRpdGxlPSJHZXNjaGxlY2h0ZXJ2ZXJ0ZWlsdW5nIGluIGRlbiBQYXJ0ZWllbiBpbSBCdW5kZXN0YWciLCANCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICIiKSwgeWF4aXM9bGlzdCh0aXRsZT0iQW56YWhsIEFiZ2VvcmRuZXRlIikpICU+JQ0KICBsYXlvdXQobGVnZW5kPWxpc3QoeD0xLCB5PTAuNSkpDQpgYGANCg0KIyMjIExhbmR0YWcgR2VzY2hsZWNodGVydmVydGVpbHVuZyBwcm8gUGFydGVpDQoNCiogZmlsdGVybiBhbGxlbiBMYW5kdGFnZW4NCiogQ0RVICYgQ1NVIHNvd2llIEZEUCAmIERWUCB6dXNhbW1lbmbDvGdlbiANCiogbmFjaCBtw6RubmxpY2ggdW5kIHdlaWJsaWNoIGdydXBwaWVyZW4sIEFuemFobCBiZXJlY2huZW4gdW5kIHNvcnRpZXJlbg0KYGBge3J9DQpsYW5kdGFnX3BhcnRlaSA8LSBQYXJsYW1lbnRhcmllciAlPiUgDQogIGZpbHRlcihLYXRlZ29yaWUgIT0iQnVuZGVzdGFnIikgJT4lIA0KICBmaWx0ZXIoS2F0ZWdvcmllIT0iRVUtUGFybGFtZW50IikgJT4lIA0KICBmaWx0ZXIoUGFydGVpICE9IkJJVyIpICU+JSANCiAgZmlsdGVyKFBhcnRlaSE9IlNTVyIpICU+JSANCiAgZmlsdGVyKFBhcnRlaSE9IkJWQi9GVyIpICU+JSANCiAgZmlsdGVyKFBhcnRlaSE9IkZXIikNCmBgYA0KDQpgYGB7cn0NCmxhbmR0YWdfcGFydGVpJFBhcnRlaVtsYW5kdGFnX3BhcnRlaSRQYXJ0ZWkgPT0gIkNTVSJdIDwtIkNEVS9DU1UiDQpsYW5kdGFnX3BhcnRlaSRQYXJ0ZWlbbGFuZHRhZ19wYXJ0ZWkkUGFydGVpPT0iQ0RVIl0gPC0gIkNEVS9DU1UiDQpsYW5kdGFnX3BhcnRlaSRQYXJ0ZWlbbGFuZHRhZ19wYXJ0ZWkkUGFydGVpPT0iRkRQL0RWUCJdIDwtICJGRFAiIA0KYGBgDQoNCmBgYHtyfQ0KbGFuZHRhZ19tYW4gPC0gbGFuZHRhZ19wYXJ0ZWkgJT4lIA0KICBncm91cF9ieShQYXJ0ZWkpICU+JSANCiAgZmlsdGVyKEdlc2NobGVjaHQ9PSJtw6RubmxpY2giKSAlPiUgDQogIHN1bW1hcmlzZShnZXNhbXRfbWFuPW4oKSkNCg0KbGFuZHRhZ19nZXNhbXQgPC0gbGFuZHRhZ19wYXJ0ZWkgJT4lIA0KICBncm91cF9ieShQYXJ0ZWkpICU+JSANCiAgZmlsdGVyKEdlc2NobGVjaHQ9PSJ3ZWlibGljaCIpICU+JSANCiAgc3VtbWFyaXNlKGdlc2FtdF9mcmF1PW4oKSkgJT4lIA0KICBsZWZ0X2pvaW4obGFuZHRhZ19tYW4pICU+JSANCiAgIG11dGF0ZShyb3dfc3VtPXJvd1N1bXMoLlsyOjNdKSkgJT4lIA0KICBhcnJhbmdlKGRlc2Mocm93X3N1bSkpDQpgYGANCg0KVmVyaMOkbHRuaXMgZGVyIFZlcnRlaWx1bmcgTcOkbm5lciB1bmQgRnJhdWVuIGJpbGRlbg0KYGBge3J9DQpsYW5kdGFnX2dlc2FtdCA8LSBsYW5kdGFnX2dlc2FtdCAlPiUgDQogIG11dGF0ZSh2ZXJow6RsdG5pc19tYW4gPSBnZXNhbXRfbWFuL3Jvd19zdW0qMTAwLCANCiAgICAgICAgIHZlcmjDpGx0bmlzX2ZyYXUgPSBnZXNhbXRfZnJhdS9yb3dfc3VtKjEwMCkgDQpgYGANCg0KIyMgQmFsa2VuZGlhZ3JhbW06IEdlc2NobGVjaHRlcnZlcnRlaWx1bmcgaW4gZGVuIExhbmR0YWdlbg0KDQoqIFN0YWNrZWQtQmFyY2hhcnQgenVyIEdlc2NobGVjaHRlcnZlcnRlaWx1bmcgaW4gZGVuIExhbmR0YWdlbiBwcm8gUGFydGVpDQoqIHZpc3VhbGlzaWVydW5nIGRlciBEYXRlbiBpbiBtw7ZnbGljaHN0IGdlc2NobGVjaHRlcm5ldXJhbGVuIEZhcmJlbg0KYGBge3J9DQpwbG90X2x5KGRhdGE9bGFuZHRhZ19nZXNhbXQsIHg9fnJlb3JkZXIoUGFydGVpLCAtdmVyaMOkbHRuaXNfbWFuKSwgeT1+dmVyaMOkbHRuaXNfZnJhdSwgbmFtZT0id2VpYmxpY2giLCBtYXJrZXI9bGlzdChjb2xvcj10b1JHQigiI0ZCN0Y2MiIpKSwgDQogICAgICAgIHR5cGU9ImJhciIsIGhvdmVyaW5mbz0idGV4dCIsIHRleHQ9fnBhc3RlKCJHZXNhbXRhbnphaGw6ICIsIHJvd19zdW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvYnI+QW56YWhsIG3DpG5ubGljaDogIiwgZ2VzYW10X21hbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9icj5BbnphaGwgd2VpYmxpY2g6ICIsIGdlc2FtdF9mcmF1DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgaG92ZXJ0ZW1wbGF0ZT1wYXN0ZSgiQW50ZWlsOiAle3k6LC4wZn0lIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4le3RleHR9IikpICU+JSANCiAgYWRkX3RyYWNlKHk9fnZlcmjDpGx0bmlzX21hbiwgbmFtZT0ibcOkbm5saWNoIiwgbWFya2VyPWxpc3QoY29sb3I9dG9SR0IoIiM3NzUyODUiKSkpICU+JSANCiAgbGF5b3V0KGJhcm1vZGU9InN0YWNrIiwgdGl0bGU9Ikdlc2NobGVjaHRlcnZlcnRlaWx1bmcgaW4gZGVuIFBhcnRlaWVuIGluIGRlbiBMYW5kdGFnZW4iLA0KICAgICAgICAgeGF4aXM9bGlzdCh0aXRsZT0iIiksIHlheGlzPWxpc3QodGl0bGU9IkFuemFobCBBYmdlb3JkbmV0ZSIpKSAlPiUNCiAgbGF5b3V0KGxlZ2VuZD1saXN0KHg9MSwgeT0wLjUpKQ0KYGBgDQojIEJhbGtlbmRpYWdyYW1tZTogR2VzY2hsZWNodGVydmVydGVpbHVuZw0KDQpEaWUgYmVpZGVuIEJhbGtlbmRpYWdyYW1tZSB6ZWlnZW4gZGllIGFrdHVlbGxlIGZyYWt0aW9uc2Jlem9nZW5lIEdlc2NobGVjaHRlcnZlcnRlaWx1bmcgaW4gZGVyIGRldXRzY2hlbiBQb2xpdGlrIOKAkyBlaW5tYWwgaW4gQmV6dWcgYXVmIGRlbiBCdW5kZXN0YWcgdW5kIGVpbm1hbCBoaW5zaWNodGxpY2ggZGVyIExhbmR0YWdlLiBJbSB6d2VpdGVuIEZhbGwgd3VyZGVuIGRpZSBBYmdlb3JkbmV0ZW4gYWxsZXIgTGFuZHRhZ2UgYWRkaWVydCwgdW0gc28gZWluZW4gZHVyY2hzY2huaXR0bGljaGVuIEdlc2FtdMO8YmVyYmxpY2sgenUgZXJtw7ZnbGljaGVuLiANCg0KRsO8ciBlaW5lIGJlc3NlcmUgVmVyZ2xlaWNoYmFya2VpdCBrb256ZW50cmllcmVuIHNpY2ggYmVpZGUgRGFyc3RlbGx1bmdlbiBhdWYgaWhyZSBnZW1laW5zYW1lIFNjaG5pdHRtZW5nZSBkZXIgRnJha3Rpb25lbi4gU28gd2lyZCBiZWlzcGllbHN3ZWlzZSBkaWUgU1NXIG5pY2h0IGF1ZmdlZsO8aHJ0LCBkYSBzaWUgbnVyIGltIFNjaGxlc3dpZy1Ib2xzdGVpbmlzY2hlbiBMYW5kdGFnIGFnaWVydC4gDQoNCkZyYWt0aW9uZW4sIGRpZSBpbiBiZXN0aW1tdGVuIEzDpG5kZXJuIGFuZGVyZSBCZXplaWNobnVuZ2VuIGhhYmVuLCB3dXJkZW4genVzYW1tZW5nZWZhc3N0IChDRFUvQ1NVIHVuZCBGRFAvRFZQIHp1IEZEUCkuIA0KDQpJbSB2ZXJ3ZW5kZXRlbiBEYXRlbnNhdHogbGFnZW4gendhciBJbmZvcm1hdGlvbmVuIHp1bSBHZXNjaGxlY2h0IHZvciwgZGllc2Ugd2FyZW4gamVkb2NoIGzDvGNrZW5oYWZ0LiBGZWhsZW5kZSBHZXNjaGxlY2h0c2FuZ2FiZW4gd3VyZGVuIG1hbnVlbGwgaGluenVnZWbDvGd0LCB3b2JlaSB2b20gw7xibGljaGVuIEdlbnVzIGRlcyBOYW1lbnMgYXVmIGRhcyBHZXNjaGxlY2h0IGdlc2NobG9zc2VuIHd1cmRlLiANCg0KRGllIEjDtmhlIGRlciBCYWxrZW4gZ2lidCBqZXdlaWxzIGFuLCB3aWUgdmllbGUgQWJnZW9yZG5ldGUgZGllIGpld2VpbGlnZSBGcmFrdGlvbiBoYXQuIERlciBsaWxhZmFyYmVuZSBUZWlsIGplZGVzIEJhbGtlbnMgemVpZ3QgZGllIEFuemFobCBkZXIgbcOkbm5saWNoZW4sIGRlciBvcmFuZ2VuZSBCYWxrZW4gZGllIFphaGwgZGVyIHdlaWJsaWNoZW4gQWJnZW9yZG5ldGVuLiBIb3ZlcnQgbWFuIMO8YmVyIGRpZSBCYWxrZW4sIHdpcmQgZGllIGpld2VpbHMgZ2VzY2hsZWNodHNiZXpvZ2VuZSBBbnphaGwgc293aWUgZGllIEdlc2FtdGFuemFobCBkZXIgQWJnZW9yZG5ldGVuIGFuZ2V6ZWlndCwgdW0gZWluZSBFaW5zY2jDpHR6dW5nIGRlcyBBbnRlaWxzIHp1IGVybcO2Z2xpY2hlbi4gDQoNCkVzIGlzdCBlcmtlbm5iYXIsIGRhc3MgZGllIEFmRCBzb3dvaGwgaW4gZGVuIExhbmR0YWdlbiBhbHMgYXVjaCBpbSBCdW5kZXN0YWcgZGV1dGxpY2ggbWVociBtw6RubmxpY2hlIEFiZ2VvcmRuZXRlIHN0ZWxsdC4gRWluZSBlYmVuc28gYXVmZsOkbGxpZ2UgVW5nbGVpY2hoZWl0IGlzdCBiZWkgZGVyIEZEUCB1bmQgQ0RVL0NTVSB6dSBzZWhlbi4gDQoNCk5haGV6dSBhdXNnZWdsaWNoZW4gaXN0IGRhZ2VnZW4gZGllIFNQRCBpbSBCdW5kZXN0YWcsIGViZW5zbyB3aWUgRGllIExpbmtlIGluIGRlbiBMYW5kdGFnZW4uIEltIEJ1bmRlc3RhZyBnaWJ0IGVzIGJlaSBEaWUgTGlua2Ugc293aWUgYmVpIGRlbiBHcsO8bmVuIG1laHIgd2VpYmxpY2hlIGFscyBtw6RubmxpY2hlIEFiZ2VvcmRuZXRlLiANCg0KDQoNCg0KDQojIyMgS2FydGUgbWl0IEdlc2NobGVjaHRlcnZlcnRlaWx1bmcgaW4gZGVuIExhbmR0YWdlbg0KDQoqIEFsbGUgTGFuZHRhZ2UgaGVyYXVzZmlsdGVybg0KYGBge3J9DQpwYXJsYW1lbnRhcmllcl9sYW5kdGFnIDwtIFBhcmxhbWVudGFyaWVyICU+JSANCiAgZmlsdGVyKEthdGVnb3JpZSAlaW4lIGMoIkFiZ2VvcmRuZXRlbmhhdXMgdm9uIEJlcmxpbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiQmF5ZXJpc2NoZXIgTGFuZHRhZyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiQnJlbWlzY2hlIELDvHJnZXJzY2hhZnQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkhhbWJ1cmdpc2NoZSBCw7xyZ2Vyc2NoYWZ0IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICJIZXNzaXNjaGVyIExhbmR0YWciLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkxhbmR0YWcgQnJhbmRlbmJ1cmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkxhbmR0YWcgZGVzIFNhYXJsYW5kZXMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkxhbmR0YWcgTWVja2xlbmJ1cmctVm9ycG9tbWVybiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiTGFuZHRhZyBOb3JkcmhlaW4tV2VzdGZhbGVuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICJMYW5kdGFnIFJoZWlubGFuZC1QZmFseiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiTGFuZHRhZyBTYWNoc2VuLUFuaGFsdCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiTGFuZHRhZyB2b24gQmFkZW4tV8O8cnR0ZW1iZXJnIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICJOaWVkZXJzw6RjaHNpc2NoZXIgTGFuZHRhZyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiU8OkY2hzaXNjaGVyIExhbmR0YWciLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlNjaGxlc3dpZy1Ib2xzdGVpbmlzY2hlciBMYW5kdGFnIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICJUaMO8cmluZ2VyIExhbmR0YWciKSkNCmBgYA0KDQoqIFZla3RvcmVuIHVuZCBEYXRhZnJhbWUgZXJzdGVsbGVuIG1pdCBkZW4gS29vcmRpbmF0ZW4gYW4gZGVuZW4gZGllIHNww6R0ZXJlbiBQaWUtQ2hhcnRzIGZpeGllcnQgd2VyZGVuIHNvbGxlbi4gKEltbWVyIGdlbmF1IGltIE1pdHRlbHB1bmt0IGRlcyBCdW5kZXNsYW5kZXMpDQoNCmBgYHtyfQ0KS2F0ZWdvcmllIDwtIGMoIkFiZ2VvcmRuZXRlbmhhdXMgdm9uIEJlcmxpbiIsIA0KICAgICAgICAgICAgICAgIkJheWVyaXNjaGVyIExhbmR0YWciLCANCiAgICAgICAgICAgICAgICJCcmVtaXNjaGUgQsO8cmdlcnNjaGFmdCIsDQogICAgICAgICAgICAgICAiSGFtYnVyZ2lzY2hlIELDvHJnZXJzY2hhZnQiLCANCiAgICAgICAgICAgICAgICJIZXNzaXNjaGVyIExhbmR0YWciLA0KICAgICAgICAgICAgICAgIkxhbmR0YWcgQnJhbmRlbmJ1cmciLCANCiAgICAgICAgICAgICAgICJMYW5kdGFnIGRlcyBTYWFybGFuZGVzIiwNCiAgICAgICAgICAgICAgICJMYW5kdGFnIE1lY2tsZW5idXJnLVZvcnBvbW1lcm4iLA0KICAgICAgICAgICAgICAgIkxhbmR0YWcgTm9yZHJoZWluLVdlc3RmYWxlbiIsDQogICAgICAgICAgICAgICAiTGFuZHRhZyBSaGVpbmxhbmQtUGZhbHoiLA0KICAgICAgICAgICAgICAgIkxhbmR0YWcgU2FjaHNlbi1BbmhhbHQiLCANCiAgICAgICAgICAgICAgICJMYW5kdGFnIHZvbiBCYWRlbi1Xw7xydHRlbWJlcmciLCANCiAgICAgICAgICAgICAgICJOaWVkZXJzw6RjaHNpc2NoZXIgTGFuZHRhZyIsIA0KICAgICAgICAgICAgICAgIlPDpGNoc2lzY2hlciBMYW5kdGFnIiwgDQogICAgICAgICAgICAgICAiU2NobGVzd2lnLUhvbHN0ZWluaXNjaGVyIExhbmR0YWciLCANCiAgICAgICAgICAgICAgICJUaMO8cmluZ2VyIExhbmR0YWciKQ0KDQpsYXQgPC0gYyg1Mi41MjAwMDgsDQogICAgICAgICA0OC45MTc0MzEsDQogICAgICAgICA1My4wNzQ5ODIsDQogICAgICAgICA1My41NTM4MTUsDQogICAgICAgICA1MC42NTIwNTIsDQogICAgICAgICA1Mi40MDg0MTgsDQogICAgICAgICA0OS4zOTY0MjMsDQogICAgICAgICA1My42MTI2NTEsDQogICAgICAgICA1MS40MzMyMzcsDQogICAgICAgICA1MC4xMTgzNDYsDQogICAgICAgICA1MS45NTAyNjUsDQogICAgICAgICA0OC42NjE2MDQsDQogICAgICAgICA1Mi42MzY3MDQsDQogICAgICAgICA1MS4xMDQ1NDEsDQogICAgICAgICA1NC4yMTkzNjcsDQogICAgICAgICA1MS4wMTA5ODkpDQoNCmxuZyA8LSBjKDEzLjQwNDk1NCwNCiAgICAgICAgIDExLjQwNzk4MCwNCiAgICAgICAgIDguODA3MDgwLA0KICAgICAgICAgOS45OTE1NzUsDQogICAgICAgICA5LjE2MjQzOCwNCiAgICAgICAgIDEyLjU2MjQ5MiwNCiAgICAgICAgIDcuMDIyOTYxLA0KICAgICAgICAgMTIuNDI5NTk1LA0KICAgICAgICAgNy42NjE1OTQsDQogICAgICAgICA3LjMwODk1MywNCiAgICAgICAgIDExLjY5MjI3NCwNCiAgICAgICAgIDkuMzUwMTM0LA0KICAgICAgICAgOS44NDUwNzcsDQogICAgICAgICAxMy4yMDE3MzgsDQogICAgICAgICA5LjY5NjExNywNCiAgICAgICAgIDEwLjg0NTM0NikNCg0KYnVuZGVzbGFlbmRlcl9rb29yZGluYXRlbiA8LSBkYXRhLmZyYW1lKEthdGVnb3JpZSwgbGF0LCBsbmcpDQpgYGANCg0KKiBEYXRhZnJhbWUgbmFjaCBBbnphaGwgZGVyIG3DpG5ubGljaGVuIHVuZCB3ZWlibGljaGVuIFBvbGl0aWtlcippbm5lbiBwcm8gQnVuZGVzbGFuZCBmaWx0ZXJuLg0KDQpgYGB7cn0NCnBhcmxhbWVudGFyaWVyX21hbiA8LSBwYXJsYW1lbnRhcmllcl9sYW5kdGFnICU+JSANCiAgZ3JvdXBfYnkoS2F0ZWdvcmllKSAlPiUgDQogIGZpbHRlcihHZXNjaGxlY2h0ID09ICJtw6RubmxpY2giKSAlPiUgDQogIHN1bW1hcmlzZShtw6RubmxpY2ggPSBuKCkpDQoNCnBhcmxhbWVudGFyaWVyX2xhbmR0YWdfZ2VzYW10IDwtIHBhcmxhbWVudGFyaWVyX2xhbmR0YWcgJT4lIA0KICBncm91cF9ieShLYXRlZ29yaWUpICU+JSANCiAgZmlsdGVyKEdlc2NobGVjaHQgPT0gIndlaWJsaWNoIikgJT4lIA0KICBzdW1tYXJpc2Uod2VpYmxpY2ggPSBuKCkpICU+JSANCiAgbGVmdF9qb2luKHBhcmxhbWVudGFyaWVyX21hbikNCmBgYA0KDQoqIEtvb3JkaW5hdGVuIGRlciBzcMOkdGVyZW4gUGllLUNoYXJ0cyB6dXIgSGF1cHR0YWJlbGxlIGpvaW5lbg0KDQpgYGB7cn0NCnBhcmxhbWVudGFyaWVyX2tvb3JkaW5hdGVuIDwtIHBhcmxhbWVudGFyaWVyX2xhbmR0YWdfZ2VzYW10ICU+JSANCiAgbGVmdF9qb2luKGJ1bmRlc2xhZW5kZXJfa29vcmRpbmF0ZW4sIGJ5ID0gYygiS2F0ZWdvcmllIiA9ICJLYXRlZ29yaWUiKSkNCmBgYA0KDQojIyMgS2FydGUgbWl0IFRvcnRlbmRpYWdyYW1tIHp1ciBHZXNjaGxlY2h0ZXJ2ZXJ0ZWlsdW5nDQoNCiogZ2VzY2hsZWNodGVybmV1dHJhbGUgRmFyYmVuIGbDvHIgZGllIEdlc2NobGVjaHRlcnZlcnRlaWx1bmcgZXJzdGVsbGVuLCBzb3dpZSBkaWUgR3JlbnplbiBkZXIgQnVuZGVzbMOkbmRlciBpbXBvcnRpZXJlbiB1bmQgbWl0IE5hbWVuIHZlcnNlaGVuIChwb3B1cCkuDQpgYGB7cn0NCmNvbG9ycyA8LSBjKCIjRkI3RjYyIiwgIiM3NzUyODUiKQ0KDQpncmVuemVuIDwtIHJlYWRSRFMoIkRhdGEvZ2FkbTM2X0RFVV8xX3NwLnJkcyIpICU+JSANCiAgc3RfYXNfc2YoKQ0KDQpwb3B1cF9idW5kZXNsYWVuZGVyIDwtIHBhc3RlMCgiPHN0cm9uZz5CdW5kZXNsYW5kOiA8L3N0cm9uZz4iLCBncmVuemVuJE5BTUVfMSkNCmBgYA0KDQoqIFBpZS1DaGFydHMgbWl0IEhpbGZlIHZvbiBhZGRNaW5pY2hhcnRzIHp1ciBLYXJ0ZSBhbmdlZsO8Z3QuIA0KDQpgYGB7cn0NCm1hcCA8LSBsZWFmbGV0KCkgJT4lIA0KICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRDYXJ0b0RCLlZveWFnZXJMYWJlbHNVbmRlcikgJT4lIA0KICBzZXRWaWV3KGxuZyA9IDEwLjQ1MTUyNiwgbGF0ID0gNTEuMTY1NjkxLCB6b29tID0gNS41KSAlPiUgDQogIGFkZFBvbHlnb25zKGRhdGEgPSBncmVuemVuLA0KICAgICAgICAgICAgICBmaWxsQ29sb3IgPSAiZ3JleSIsDQogICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gMC4xLA0KICAgICAgICAgICAgICB3ZWlnaHQgPSAzLA0KICAgICAgICAgICAgICBjb2xvciA9ICJncmV5IiwNCiAgICAgICAgICAgICAgcG9wdXAgPSBwb3B1cF9idW5kZXNsYWVuZGVyKSAlPiUgDQogIGFkZE1pbmljaGFydHMoDQogICAgcGFybGFtZW50YXJpZXJfa29vcmRpbmF0ZW4kbG5nLCBwYXJsYW1lbnRhcmllcl9rb29yZGluYXRlbiRsYXQsDQogICAgdHlwZSA9ICJwaWUiLA0KICAgIGNoYXJ0ZGF0YSA9IHBhcmxhbWVudGFyaWVyX2tvb3JkaW5hdGVuWywgYygid2VpYmxpY2giLCAibcOkbm5saWNoIildLA0KICAgIGNvbG9yUGFsZXR0ZSA9IGNvbG9ycywNCiAgICB3aWR0aCA9IDQ2LA0KICAgIGhlaWdodCA9IDQ2LA0KICAgIG9wYWNpdHkgPSAwLjgsDQogICAgbGVnZW5kUG9zaXRpb24gPSAiYm90dG9tcmlnaHQiDQogICkNCm1hcA0KYGBgDQojIEthcnRlIG1pdCBHZXNjaGxlY2h0ZXJ2ZXJ0ZWlsdW5nIGluIGRlbiBMYW5kdGFnZW4NCg0KRGllIGF1ZiBkZXIgRGV1dHNjaGxhbmRrYXJ0ZSBhYmdlYmlsZGV0ZW4gVG9ydGVuLURpYWdyYW1tZSB2ZXJhbnNjaGF1bGljaGVuIGRpZSBTaXR6dmVydGVpbHVuZyBkZXIgQWJnZW9yZG5ldGVuIGluIGRlbiBkZXV0c2NoZW4gTGFuZGVzcGFybGFtZW50ZW4gYXVmZ2VzY2hsw7xzc2VsdCBuYWNoIGRlciBHZXNjaGxlY2h0ZXJ6dWdlaMO2cmlna2VpdCAobcOkbm5saWNoZW4gQWJnZW9yZG5ldGUsIHdlaWJsaWNoZW4gQWJnZW9yZG5ldGUpLiAgDQoNCkRhYmVpIHd1cmRlLCB1bSBkZW4gQXNwZWt0IGRlciBsYW5kZXNzcGV6aWZpc2NoZW4sIGFiZXIgZGV1dHNjaGxhbmR3ZWl0ZW4gR2VzY2hsZWNodGVycmVwcsOkc2VudGFueiBoZXJ2b3J6dWhlYmVuLCBkaWUgRnJha3Rpb25zenVnZWjDtnJpZ2tlaXQgZGVyIEFiZ2VvcmRuZXRlbiBpbiBkZXIgRGFyc3RlbGx1bmcgbmljaHQgYmVyw7xja3NpY2h0aWd0LiAgDQoNClp1bsOkY2hzdCBmw6RsbHQgYXVmLCBkYXNzIGluIGFsbGVuIExhbmRlc3BhcmxhbWVudGVuIG1laHIgbcOkbm5saWNoZSBBYmdlb3JkbmV0ZSBhbHMgd2VpYmxpY2hlIEFiZ2VvcmRuZXRlIHNpdHplbi4gQmVpbmFoZSBpbiBqZWRlbSBMYW5kdGFnIGJld2VndCBzaWNoIGRpZXNlIHVuZ2xlaWNoZSBTaXR6dmVydGVpbHVuZyB6d2lzY2hlbiBlaW5lciB6d2VpZHJpdHRlbCAtIGJpcyB6dSBlaW5lciBkcmVpdmllcnRlbC0gTWVocmhlaXQgYW4gbcOkbm5saWNoZW4gQWJnZW9yZG5ldGVuLiAgDQoNCkVpbnppZyBkaWUgSGFtYnVyZ2lzY2hlIELDvHJnZXJzY2hhZnQgd2Vpc3QgYW5uw6RoZXJuZCBlaW4gYXVzZ2VnbGljaGVuZXMgMS16dS0xLVZlcmjDpGx0bmlzIHp3aXNjaGVuIG3DpG5ubGljaGVuIHVuZCB3ZWlibGljaGVuIEFiZ2VvcmRuZXRlbiBhdWYsIHdlbm5nbGVpY2ggYXVjaCBoaWVyIGRpZSBBbnphaGwgZGVyIG3DpG5ubGljaGVuIEFiZ2VvcmRuZXRlbiBsZWljaHQgw7xiZXJ3aWVndC4gQW0gZ3LDtsOfdGVuIGlzdCBkaWUgVW5hdXNnZWdsaWNoZW5oZWl0IGluIFNhY2hzZW4tQW5oYWx0IG1pdCA0NiB3ZWlibGljaGVuIEFiZ2VvcmRuZXRlbiB1bmQgODMgbcOkbm5saWNoZW4gQWJnZW9yZG5ldGVuLiANCg0KDQoNCg0KDQojIFR3ZWV0cyBkZXIgUG9saXRpa2VyKmlubmVuIHNjcmFwZW4NCg0KTmljaHQgYWxzIGF1c2bDvGhyYmFyZW4gQ29kZSwgZGFtaXQgZGllIERhdGVuIG5pY2h0IG5vY2htYWxzIGdlem9nZW4gd2VyZGVuLi4uDQoNClR3aXR0ZXJfYWNjb3VudHMgPC0gUGFybGFtZW50YXJpZXIgJT4lDQogIGZpbHRlcihLYXRlZ29yaWUhPSJFVS1QYXJsYW1lbnQiKSAlPiUNCiAgZmlsdGVyKFBhcnRlaSE9IkJJVyIpICU+JSANCiAgZmlsdGVyKFBhcnRlaSE9IlNTVyIpICU+JSANCiAgZmlsdGVyKFBhcnRlaSE9IkJWQi9GVyIpICU+JSANCiAgZmlsdGVyKFBhcnRlaSE9IkZXIikgJT4lIA0KICBmaWx0ZXIoUGFydGVpIT0iZnJha3Rpb25zbG9zIikgJT4lIA0KICBmaWx0ZXIoU01fVHdpdHRlcl91c2VyICE9ICIiKQ0KDQp0b2tlbiA8LSBnZXRfdG9rZW4oKQ0KdG9rZW4NCg0KYWxsZV90d2VldHMgPC0gbGlzdCgpDQp1c2VySWRMaXN0ID0gbGlzdChUd2l0dGVyX2FjY291bnRzJFNNX1R3aXR0ZXJfdXNlcikNCnJsIDwtIHJhdGVfbGltaXQodG9rZW4sICJzdGF0dXNlcy91c2VyX3RpbWVsaW5lIikNCmZvcih1c2VyIGluIHVzZXJJZExpc3RbWzFdXSl7DQogIGFsbGVfdHdlZXRzW1t1c2VyXV0gPC0gZ2V0X3RpbWVsaW5lKHVzZXIsIG4gPSAyLCBjaGVjayA9IEYpDQogIHByaW50KCJyYXRlIGxpbWl0IHJlbWFpbmluZzoiLCBzdHIocmwkcmVtYWluaW5nKSkNCiAgcHJpbnQoImF0IHVzZXI6Iiwgc3RyKHVzZXIpKQ0KICBybCA8LSBybCAlPiUNCiAgICBtdXRhdGUocmVtYWluaW5nID0gcmVtYWluaW5nIC0gMSkNCiAgIyBpZiByYXRlIGxpbWl0IGV4aGF1c3RlZCwgdGhlbiB3YWl0IHRvIHJhdGUgbGltaXQgcmVzZXQNCiAgaWYgKHJsJHJlbWFpbmluZyA9PSA1TCkgew0KICAgIHJsIDwtIHJhdGVfbGltaXQodG9rZW4sICJzdGF0dXNlcy91c2VyX3RpbWVsaW5lIikNCiAgICBwcmludCgicmF0ZSBsaW1pdCBleGNlZWRlZCwgd2FpdGluZyBmb3IgOTAwcyBhdCB1c2VyIiwgc3RyKHVzZXIpKQ0KICAgIFN5cy5zbGVlcChhcy5udW1lcmljKHJsJHJlc2V0LCAic2VjcyIpKQ0KICB9DQp9DQoNCiMjIyBOYWNoIHJlbGV2YW50ZW4gSGFzaHRhZ3MgZmlsdGVybiANCg0KKiAiYWxsZV90d2VldHMucmRzIiBpc3QgZGllIERhdGVpIG1pdCBhbGxlbiBnZXpvZ2VuZW4gVHdlZXRzLg0KKiBuYWNoIHJlbGV2YW50ZW4gVHdlZXRzIGZpbHRlcm4gbWl0IHZvcmhlciBiZXN0aW1tdGVuIEhhc2h0YWdzICgiVHdpdHRlci1IYXNodGFncy54bHN4IiksIFR3ZWV0cyBpbiBLbGVpbnNjaHJlaWJ1bmcgZm9ybWF0aWVyZW4gdW5kIGFscyAiZmluYWxfdHdlZXRzLnJkcyIgZXhwb3J0aWVyZW4uIA0KYGBge3J9DQphbGxlX3R3ZWV0cyA8LSByZWFkX3JkcygiRGF0YS9hbGxlX3R3ZWV0cy5yZHMiKQ0KDQpzdWNoYmVncmlmZmUgPC0gcmVhZF9leGNlbCgiRGF0YS9Ud2l0dGVyLUhhc2h0YWdzLnhsc3giLCBzaGVldCA9IlRhYmVsbGUyIikNCg0Kc3VjaGJlZ3JpZmZlX3ZlY3RvciA8LSBzdWNoYmVncmlmZmUkSGFzaHRhZ3MNCg0KYWxsZV90d2VldHMgPC0gYmluZF9yb3dzKGFsbGVfdHdlZXRzKQ0KDQphbGxlX3R3ZWV0cyA8LSBhbGxlX3R3ZWV0cyAlPiUgDQogIG11dGF0ZSh0ZXh0ID0gdG9sb3dlcih0ZXh0KSkNCg0KZmlsdGVydF90d2VldHMgPC0gYWxsZV90d2VldHMgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdCh0ZXh0LCBwYXN0ZSAoc3VjaGJlZ3JpZmZlX3ZlY3RvciwgY29sbGFwc2UgPSAifCIpKSkNCg0Kd3JpdGVfcmRzKGZpbHRlcnRfdHdlZXRzLCAiZmluYWxfdHdlZXRzLnJkcyIpDQpgYGANCg0KDQoNCg0KIyBTZW50aW1lbnRhbmFseXNlDQoNCiogbmFjaCBkZW4gImdyb8OfZW4iIFBhcnRlaWVuIGZpbHRlcm4NCiogYWxsZSBQb2xpdGlrZXIqaW5uZW4gZW50ZmVybmVuLCB3ZWxjaGUga2VpbmVuIFR3aXR0ZXJhY2NvdW50IGJlc2l0emVuDQoqIFVzZXJuYW1lcyBpbiBLbGVpbnNjaHJlaWJ1bmcgZm9ybWF0aWVyZW4NCmBgYHtyfQ0KUGFybGFtZW50YXJpZXJfc2VudGkgPC0gUGFybGFtZW50YXJpZXIgJT4lIA0KICBmaWx0ZXIoUGFydGVpIT0iQklXIikgJT4lIA0KICBmaWx0ZXIoUGFydGVpIT0iU1NXIikgJT4lIA0KICBmaWx0ZXIoUGFydGVpIT0iQlZCL0ZXIikgJT4lIA0KICBmaWx0ZXIoUGFydGVpIT0iRlciKSAlPiUgDQogIGZpbHRlcihQYXJ0ZWkhPSJmcmFrdGlvbnNsb3MiKSAlPiUgDQogIGZpbHRlcihTTV9Ud2l0dGVyX3VzZXIgIT0gIiIpICU+JSANCiAgc2VsZWN0KE5hbWUsIFBhcnRlaSwgU01fVHdpdHRlcl91c2VyLCBHZXNjaGxlY2h0KSAlPiUgDQogIG11dGF0ZShTTV9Ud2l0dGVyX3VzZXI9dG9sb3dlcihTTV9Ud2l0dGVyX3VzZXIpKQ0KYGBgDQoNCiogQ0RVICYgQ1NVIHNvd2llIEZEUCAmIERWUCB6dXNhbW1lbmbDvGdlbiANCmBgYHtyfQ0KUGFybGFtZW50YXJpZXJfc2VudGkkUGFydGVpW1BhcmxhbWVudGFyaWVyX3NlbnRpJFBhcnRlaSA9PSAiQ1NVIl0gPC0gIkNEVS9DU1UiDQpQYXJsYW1lbnRhcmllcl9zZW50aSRQYXJ0ZWlbUGFybGFtZW50YXJpZXJfc2VudGkkUGFydGVpID09ICJDRFUiXSA8LSAiQ0RVL0NTVSINClBhcmxhbWVudGFyaWVyX3NlbnRpJFBhcnRlaVtQYXJsYW1lbnRhcmllcl9zZW50aSRQYXJ0ZWkgPT0gIkZEUC9EVlAiXSA8LSAiRkRQIiANCmBgYA0KDQoqIFNlbnRpV1MgaW1wb3J0aWVyZW4sIHVtIHBvc2l0aXZlIHVuZCBuZWdhdGl2ZSBXw7ZydGVyIHp1IGtsYXNzaWZpemllcmVuDQoqIExpc3RlIHp1ciBTZW50aW1lbnRhbmFseXNlIGlzdCB2b24gVW5pdmVyc2l0w6R0IExlaXB6aWc6ICJodHRwczovL3dvcnRzY2hhdHoudW5pLWxlaXB6aWcuZGUvZGUvZG93bmxvYWQiDQpgYGB7cn0NCmxvYWQoIkRhdGEvc2VudGlXUy5SRGF0YSIpDQpzZW50aXdzIDwtIGRpY3Rpb25hcnkobGlzdChwb3NpdGl2ZT1wb3NpdGl2ZSwgbmVnYXRpdmU9bmVnYXRpdmUpKQ0KYGBgDQoNCiogQ29ycHVzIGF1cyBkZW4gVGV4dGVuIGRlciBnZWZpbHRlcnRlbiBUd2VldHMgYmlsZGVuDQpgYGB7cn0NCnR3ZWV0X2NvcnB1cyA8LSBjb3JwdXMoZmlsdGVydF90d2VldHMsIHRleHRfZmllbGQgPSAidGV4dCIpDQpgYGANCg0KKiB0b2tlbmlzaWVyZW4gZGVyIFRleHRlIHVuZCBiaWxkZW4gZWluZXIgREZNDQoqIHNlbnRpd3MgdW5kICJUd2VldC1Ub2tlbnMiIHp1c2FtbWVuZsO8aHJlbiwgc293aWUgbmFjaCBzY3JlZW5fbmFtZSBncnVwcGllcmVuDQpgYGB7cn0NCnRva2VuIDwtIHRva2Vucyh0d2VldF9jb3JwdXMpDQpkZm0gPC0gZGZtKHRva2VuKQ0KDQpzZW50aSA8LSBkZm1fbG9va3VwKGRmbSwgc2VudGl3cykgIA0Kc2VudGkgPC0gZGZtX2dyb3VwKHNlbnRpLCBncm91cHMgPSBzY3JlZW5fbmFtZSkNCmBgYA0KDQoqIERGTSB6dW0gRGF0YWZyYW1lIGtvbnZlcnRpZXJlbg0KKiBkb2NfaWQgaW4gS2xlaW5zY2hyZWlidW5nIGZvcm1hdGllcmVuDQoqIFBhcmxhbWVudGFyaWVyX3NlbnRpIGpvaW5lbg0KKiBHcnVwcGllcmVuIG5hY2ggUGFydGVpDQoqIFNlbnRpbWVudCBkZXIgZWluemVsbmVuIFVzZXIqaW5uZW4gYXVmIFBhcnRlaWViZW5lIHp1c2FtbWVuZmFzc2VuIHVuZCBWZXJow6RsdG5pcyBwb3NpdGl2ZS9uZWdhdGl2ZSBiaWxkZW4NCmBgYHtyfQ0Kc2VudGlfZnJhbWUgPC0gc2VudGkgJT4lIA0KICBxdWFudGVkYTo6Y29udmVydCh0byA9ICJkYXRhLmZyYW1lIikgJT4lIA0KICBhc190aWJibGUoKSAlPiUgDQogIG11dGF0ZShkb2NfaWQ9dG9sb3dlcihkb2NfaWQpKSAlPiUgDQogIHJlbmFtZShuZWdhdGl2ID0gbmVnYXRpdmUsIHBvc2l0aXYgPSBwb3NpdGl2ZSkNCg0Kc2VudGlfZmluYWxfZnJhbWUgPC0gc2VudGlfZnJhbWUgJT4lIA0KICBmdWxsX2pvaW4oUGFybGFtZW50YXJpZXJfc2VudGksIGJ5PWMoImRvY19pZCI9IlNNX1R3aXR0ZXJfdXNlciIpKSAlPiUgDQogIGdyb3VwX2J5KFBhcnRlaSkgJT4lIA0KICBzdW1tYXJpc2UoYWNyb3NzKGMobmVnYXRpdiwgcG9zaXRpdiksIH5yb3VuZChzdW0oLiwgbmEucm0gPSBUUlVFKS9zdW0obmVnYXRpdiArIHBvc2l0aXYsIG5hLnJtID0gVFJVRSApLCBkaWdpdHMgPSAyKSkpDQpgYGANCg0KIyMjIEJhcmNoYXJ0IHp1bSBTZW50aW1lbnQgZGVyIFR3ZWV0cw0KDQoqIFBhcnRlaSBhYnN0ZWlnZW5kIG5hY2ggbmVnYXRpdmVtIFNlbnRpbWVudCBzb3J0aWVyZW4NCiogQmVzY2hyaWZ0dW5nIGRlciBYLSB1bmQgWSBXZXJ0ZSDDpG5kZXJuDQoqIEJhcmNoYXJ0IGJpbGRlbiB1bmQgaW4gZ2dwbG90bHkga29udmVydGllcmVuDQpgYGB7cn0NCnNlbnRpX2JhciA8LSBzZW50aV9maW5hbF9mcmFtZSAlPiUgDQogIG11dGF0ZShQYXJ0ZWkgPSBmY3RfcmVvcmRlcihQYXJ0ZWksIHBvc2l0aXYsIG1heCkpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGMocG9zaXRpdiwgbmVnYXRpdiksIHZhbHVlc190byA9IGMoIlZlcmjDpGx0bmlzIiksIG5hbWVzX3RvID0gYygiw4R1w59lcnVuZyIpKSAlPiUgDQogIGdncGxvdCgpICsgDQogIGdlb21fYmFyKGFlcyhQYXJ0ZWksDQogICAgICAgICAgICAgICBWZXJow6RsdG5pcywgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgIGZpbGwgPSDDhHXDn2VydW5nKSwNCiAgICAgICAgICAgcG9zaXRpb24gPSAic3RhY2siLA0KICAgICAgICAgICBzdGF0ID0gImlkZW50aXR5IikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjZjQ2NjY2IiwgIiM4RUM5QkIiKSkgKyANCiAgdGhlbWVfbWluaW1hbCgpICsgDQogIGxhYnMoDQogICAgdGl0bGUgPSAiw4R1w59lcnVuZ2VuIGRlciBQb2xpdGlrZXIqaW5uZW4gYXVmIFR3aXR0ZXIgenVtIFRoZW1hICdHZW5kZXInIiwNCiAgICBzdWJ0aXRsZSA9ICJFaW5zY2jDpHR6dW5nIGR1cmNoIFNlbnRpbWVudGFuYWx5c2UiLA0KICAgIHggPSAiIiwNCiAgICB5ID0gIlZlcmjDpGx0bmlzIiwNCiAgICBmaWxsID0gIiINCiAgKQ0KDQpmaW5hbF9zZW50aV9wbG90IDwtIGdncGxvdGx5KHNlbnRpX2JhcikgDQpmaW5hbF9zZW50aV9wbG90ICU+JSBsYXlvdXQoYXV0b3NpemUgPSBGLCB3aWR0aCA9IDY1MCwgaGVpZ2h0ID0gNTAwLCBsZWdlbmQ9bGlzdCh4PTEsIHk9MC41KSkNCmZpbmFsX3NlbnRpX3Bsb3QgDQpgYGANCiMgU2VudGltZW50LUFuYWx5c2Ugdm9uIFR3ZWV0cyB6dW0gVGhlbWEgR2VuZGVyDQoNCkFscyBHcnVuZGxhZ2UgZsO8ciBkaWUgaGllciB2aXN1YWxpc2llcnRlIFNlbnRpbWVudC1BbmFseXNlIGRpZW5lbiBUd2VldHMsIHdlbGNoZSB2b24gQWJnZW9yZG5ldGVuIGRlciBMYW5kdGFnZSB1bmQgZGVzIEJ1bmRlc3RhZ2VzIHp1bSBUaGVtYSBHZW5kZXIgYWJnZXNldHp0IHd1cmRlbi4gTWl0IGRpZXNlciBTZW50aW1lbnQtQW5hbHlzZSBsaWXDnyBzaWNoIGVybWl0dGVsbiwgb2IgZGllc2UgVHdlZXRzIGVoZXIgcG9zaXRpdiBvZGVyIGVoZXIgbmVnYXRpdiB2ZXJmYXNzdCBzaW5kLiBEYWbDvHIgd3VyZGUgZWluIFfDtnJ0ZXJidWNoIGVpbmdlc2V0enQsIHdlbGNoZXMgbmVnYXRpdiB1bmQgcG9zaXRpdiBrb25ub3RpZXJ0ZSBXb3J0ZSB1bmQgw4R1w59lcnVuZ2VuIGlua2x1c2l2ZSBHZXdpY2h0dW5nZW4gYmVpbmhhbHRldC4gRGllc2VzIHd1cmRlIG1pdCBkZW4gVHdlZXRzIGFiZ2VnbGljaGVuLiBEYXMgRXJnZWJuaXMgemVpZ3QsIHdpZSBob2NoIGRlciBBbnRlaWwgbmVnYXRpdmVyIHVuZCBwb3NpdGl2ZXIgw4R1w59lcnVuZ2VuIGlzdC4gDQoNClVtIGRpZXMgdW16dXNldHplbiwgd3VyZGVuIHp1bsOkY2hzdCBtaXRoaWxmZSBkZXMgREJvZVMtRGF0ZW5zYXR6ZXMgYWxsZSBBYmdlb3JkbmV0ZW4gYXVzZ2V3w6RobHQsIGRpZSDDvGJlcmhhdXB0IGVpbmVuIFR3aXR0ZXItQWNjb3VudCBiZXNpdHplbi4gDQoNCkFuc2NobGllw59lbmQgd3VyZGVuIHZvbiBkaWVzZW4gTnV0emVyOmlubmVuIGpld2VpbHMgZGllIGxldHp0ZW4gMS4wMDAgVHdlZXRzIGhlcnVudGVyZ2VsYWRlbi4gRGllc2Ugd3VyZGVuIGF1ZiA0NyBIYXNodGFncyBnZWZpbHRlcnQsIHdlbGNoZSB2b3JoZXIgZmVzdGdlbGVndCB3dXJkZW4sIHVtIGRhcyBUaGVtYSBHZW5kZXIgYWJ6dWJpbGRlbiAoei5CLiAjZ2VuZGVyc3Rlcm5jaGVuLCAjZ2VuZGVyZ2FnYSwgI2VxdWFscGF5ZGF5IGV0Yy4pKi4gRXMgd3VyZGUgZGFyYXVmIGdlYWNodGV0LCBkYXNzIHNvd29obCBwb3NpdGl2ZSBhbHMgYXVjaCBuZWdhdGl2ZSBIYXNodGFncyBlaW5iZXpvZ2VuIHdlcmRlbiwgdW0gbcO2Z2xpY2hzdCBhbGxlIE1laW51bmdlbiBmw7xyIGRpZSBBbmFseXNlIGVpbmJlemllaGVuIHp1IGvDtm5uZW4uICANCg0KRGllIHNvIGdlZmlsdGVydGVuIFR3ZWV0cyB3dXJkZW4gZGFubiB6dSBlaW5lbSBDb3JwdXMgenVzYW1tZW5nZWZhc3N0LiBNaXQgZGllc2VtIENvcnB1cyB3dXJkZSBlaW5lIFNlbnRpbWVudC1BbmFseXNlIGR1cmNoZ2Vmw7xocnQsIHdvYmVpIGRlciBXb3J0c2NoYXR6IOKAnlNlbnRpV1PigJwqIGRlciBVbml2ZXJzaXTDpHQgTGVpcHppZyBhbHMgR3J1bmRsYWdlIGRpZW50ZS4gQW5zY2hsaWXDn2VuZCB3dXJkZSBuYWNoIGRlbiBlaW56ZWxuZW4gUGFydGVpZW4gZ3J1cHBpZXJ0IHVuZCBkZXIgcGFzc2VuZGUgVGVpbCBkZXMgQ29ycHVzIChqZSBuYWNoIFBhcnRlaXp1Z2Vow7ZyaWdrZWl0IGRlcyBvZGVyIGRlciB0d2VldGVuZGVuIEFiZ2VvcmRuZXRlbikgaW5rbHVzaXZlIEFuYWx5c2VlcmdlYm5pcyB6dWdlb3JkbmV0LiAgDQoqaHR0cHM6Ly93b3J0c2NoYXR6LnVuaS1sZWlwemlnLmRlL2RlL2Rvd25sb2FkIA0KDQpEaWUgRXJnZWJuaXNzZSBkZXIgQW5hbHlzZSBzaW5kIGluIGRlciBWaXN1YWxpc2llcnVuZyB6dSBlcmtlbm5lbi4gRGllIEFiZ2VvcmRuZXRlbiB2b24gZGVyIEFmRCB1bmQgdm9uIERpZSBMaW5rZSBoYWJlbiBnZW1laW5zYW0gZGVuIGjDtmNoc3RlbiBBbnRlaWwgbmVnYXRpdmVyIFR3ZWV0cyB2ZXJmYXNzdCwgamV3ZWlscyBkaWUgSMOkbGZ0ZSB3dXJkZSBhbHMgbmVnYXRpdiBhdXNnZXdlcnRldC4gRGVyIGdlcmluZ3N0ZSBuZWdhdGl2ZSBUZWlsIHd1cmRlIGJlaSBkZXIgQ0RVL0NTVSBmZXN0Z2VzdGVsbHQuIA0KDQpadSBiZWFjaHRlbiBpc3QsIGRhc3MgYXVzIGRlciBTZW50aW1lbnQtQW5hbHlzZSBuaWNodCBoZXJ2b3JnZWh0LCBvYiBiZWlzcGllbHN3ZWlzZSBuZWdhdGl2IMO8YmVyIGRpZSBHbGVpY2hiZWhhbmRsdW5nIGRlciBHZXNjaGxlY2h0ZXIgZ2VzY2hyaWViZW4gd2lyZCBvZGVyIG5lZ2F0aXYgZGFyw7xiZXIsIGRhc3MgZXMgbm9jaCBrZWluZSBHbGVpY2hiZWhhbmRsdW5nIGdpYnQuIERlciBnZW5hdWUgSW5oYWx0IGRlcyBUd2VldHMgYmxlaWJ0IHVuYmVhY2h0ZXQuIFNvbWl0IGzDpHNzdCBzaWNoIGhpZXIgbmljaHQgYWJsZXNlbiwgb2IgZGllIEFiZ2VvcmRuZXRlbiBkZXIgUGFydGVpZW4gamV3ZWlscyBmw7xyIEdlc2NobGVjaHRlcmdsZWljaGhlaXQgcGzDpGRpZXJlbiBvZGVyIGRhZ2VnZW4uIEdlcmFkZSBhbSBFcmdlYm5pcyB2b24gQWZEIHVuZCBEaWUgTGlua2Ugd2lyZCBkaWVzIGRldXRsaWNoLCBkYSBkaWUgRWluc3RlbGx1bmdlbiBiZXrDvGdsaWNoIGRlcyBUaGVtYXMgdHJvdHogZ2xlaWNod2VydGlnZW0gRXJnZWJuaXMgaMO2Y2hzdHdhaHJzY2hlaW5saWNoIHZlcnNjaGllZGVuIHNpbmQuIA0KDQoqTGlzdGUgYWxsZXIgZ2VzdWNodGVuIEhhc2h0YWdzOiAjZ2VuZGVycGF5Z2FwLCAjZ2VuZGVyZXF1YWxpdHksICN3b21lbmVtcG93ZXJtZW50LCAjZmVtaW5pc20sICNmZW1pbmlzbXVzLCAjZ2VuZGVyZ2FnYSwgI2dlbmRlciwgI3NleGlzbXVzLCAjR2VlbmFPbkdlbmRlciwgI2dlbmRlcmluZywgI2dlbmRlcnNwcmFjaGUsICNnZW5kZXJlcXVpdHksICNnbGVpY2hiZXJlY2h0aWd1bmcsICNmcmF1ZW5wb3dlciwgI2ZyYXVlbnJlY2h0ZSwgI2ZyYXVlbmJld2VndW5nLCAjZXZlcnlkYXlzZXhpc20sICNmaWdodHNleGlzbSwgI3NleGlzbSwgI25vbWVhbnNubywgI0FpbnROb0NpbmRlcmVsbGEsICNOaVVuYU1lbm9zLCAjTmlVbmFNYXMsICNNeVN0ZWFsdGh5RnJlZWRvbSwgI2VxdWFscGF5LCAjZmVtYWxlZW1wb3dlcm1lbnQsICNnZW5kZXJzdGVybmNoZW4sICNtYW5zcHJlYWRpbmcsICNnZW5kZXJuLCAjbWVuYXJldHJhc2gsICNnZW5kZXJzcHJlY2gsICNnZW5kZXJ2ZXJib3QsICNnZW5kZXJzaGl0LCAjZXF1YWxwYXlkYXksICN3b21lbnNkYXksICN3ZWx0ZnJhdWVudGFnLCAjaW50ZXJuYXRpb25hbHdvbWVuc2RheSwgI2ZyYXVlbnRhZywgI2dlbmRlcmdlcmVjaHRlc3ByYWNoZSwgI2dlbmRlcnBvbGl6ZWksICNmZW1hbGVoZXJvLCAjZ2VuZGVyc2Nod2FjaHNpbm4sICNnZWJhbGx0ZXJGZW1pbmlzbXVzLCAjZ2VzY2hsZWNodGVyd2FobiwgI2dlc2NobGVjaHRlcndhaG5zaW5uLCAjZnJhdWVuLCAjbcOkbm5lciANCg0KDQoNCg0KDQoNCiMgTmV0endlcmthbmFseXNlIGRldXRzY2hlciBQb2xpdGlrZXIqaW5uZW4genVtIFRoZW1hIEdlbmRlciBhdWYgVHdpdHRlciANCg0KKiBmaWx0ZXJ0X3R3ZWV0cyAidmVya2xlaW5lcm4iIHVuZCBpbiB0d2VldHNfbmV0d29yayBzcGVpY2hlcm4NCiogc2NyZWVuX25hbWUgaW4gS2xlaW5zY2hyZWlidW5nIGZvcm1hdGllcmVuDQpgYGB7cn0NCnR3ZWV0c19uZXR3b3JrIDwtIGZpbHRlcnRfdHdlZXRzICU+JSANCiAgc2VsZWN0KHNjcmVlbl9uYW1lLA0KICAgICAgICAgcmV0d2VldF9zY3JlZW5fbmFtZSwNCiAgICAgICAgIGNyZWF0ZWRfYXQpIA0KYGBgDQoNCiogUGFybGFtZW50YXJpZXIgRGF0YWZyYW1lIG1pdCB0d2VldHNfbmV0d29yayBqb2luZW4sIHVtIEtsYXJhbWVuIHVuZCBQYXJ0ZWl6dWdlaMO2cmlna2VpdCBkZXIgUG9saXRpa2VyKmlubm5lbiB6dSBiZWtvbW1lbg0KYGBge3J9DQpwYXJsYW1lbnRhcmllcl9uZXR3b3JrIDwtIFBhcmxhbWVudGFyaWVyICU+JSANCiAgc2VsZWN0KE5hbWUsDQogICAgICAgICBQYXJ0ZWksDQogICAgICAgICBTTV9Ud2l0dGVyX3VzZXIpICU+JSANCiAgZHJvcF9uYShTTV9Ud2l0dGVyX3VzZXIpICU+JSANCiAgcmVuYW1lKCJzY3JlZW5fbmFtZSIgPSAiU01fVHdpdHRlcl91c2VyIikNCg0KbmV0d29ya19kYXRhIDwtIHBhcmxhbWVudGFyaWVyX25ldHdvcmsgJT4lIA0KICBsZWZ0X2pvaW4odHdlZXRzX25ldHdvcmssIGJ5ID0gInNjcmVlbl9uYW1lIikNCmBgYA0KDQoqIEjDpHVmaWdrZWl0IGRlciBUd2VldHMgenVtIFRoZW1hIGJlcmVjaG5lbiANCiogSMOkdWZpZ2tlaXQgenUgbmV0d29ya19kYXRhIGpvaW5lbg0KYGBge3J9DQpoYXVlZmlna2VpdF90d2VldHMgPC0gbmV0d29ya19kYXRhICU+JSANCiAgY291bnQoc2NyZWVuX25hbWUpDQoNCm5ldHdvcmtfZGF0YSA8LSBuZXR3b3JrX2RhdGEgJT4lIA0KICBsZWZ0X2pvaW4oaGF1ZWZpZ2tlaXRfdHdlZXRzLCBieSA9ICJzY3JlZW5fbmFtZSIpDQpgYGANCg0KKiBWZWt0b3IgZGVyIHNjcmVlbl9uYW1lcyBhbGxlciBQb2xpdGlrZXIqaW5uZW4gZXJzdGVsbGVuDQoqIHJldHdlZXRfc2NyZWVuX25hbWUgYXVmIGRpZXNlIHNjcmVlbl9uYW1lcyBmaWx0ZXJuLCB1bSAiRnJlbWR1c2VyKmlubmVuIiBhdXN6dXNjaGxpZcOfZW4gDQpgYGB7cn0NCnNjcmVlbl9zdWNoZSA8LSBwYXJsYW1lbnRhcmllcl9uZXR3b3JrJHNjcmVlbl9uYW1lDQoNCmZpbHRlcmVkX3JldHdlZXRlcnMgPC0gbmV0d29ya19kYXRhICU+JSANCiAgZmlsdGVyKHJldHdlZXRfc2NyZWVuX25hbWUgJWluJSBzY3JlZW5fc3VjaGUpDQpgYGANCg0KKiBOZXR6IG1pdCByZWxldmFudGVuIFdlcnRlbiBkZWZpbmllcmVuIG1pdDogDQoqIEVkZ2VzID0gdm9uIHNjcmVlbl9uYW1lIHp1IHJldHdlZXRfc2NyZWVuX25hbWUNCiogTm9kZXMgPSBQb2xpdGlrZXIqaW5uZW4gKHNjcmVlbl9uYW1lIHVuZCByZXR3ZWV0X3NjcmVlbl9uYW1lKSANCiogSm9pbmUgYXVmcyBOZXR6IFBhcnRlaXp1Z2Vow7ZyaWdrZWl0LCBLbGFybmFtZW4gdW5kIEjDpHVmaWdrZWl0IGRlciBUd2VldHMgenVtIFRoZW1hIChuKQ0KYGBge3J9DQpuZXR6IDwtIGZpbHRlcmVkX3JldHdlZXRlcnMgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHJldHdlZXRfc2NyZWVuX25hbWUpKSAlPiUgDQogIHNlbGVjdChmcm9tID0gc2NyZWVuX25hbWUsIHRvID0gcmV0d2VldF9zY3JlZW5fbmFtZSkgJT4lIA0KICBhc190YmxfZ3JhcGgNCg0KbmV0eiA8LSBuZXR6ICU+JSANCiAgbXV0YXRlKA0KICAgIGRlZ3JlZSA9IGNlbnRyYWxpdHlfZGVncmVlKG1vZGUgPSAiaW4iKSwgDQogICAgY29tcG9uZW50ID0gZ3JvdXBfY29tcG9uZW50cygpDQogICkgJT4lIA0KICBsZWZ0X2pvaW4obmV0d29ya19kYXRhICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KE5hbWUsIHNjcmVlbl9uYW1lLCBQYXJ0ZWksIG4pICU+JSBkaXN0aW5jdChzY3JlZW5fbmFtZSwgLmtlZXBfYWxsID0gVCksDQogICAgICAgICAgICBieSA9IGMoICJuYW1lIiA9InNjcmVlbl9uYW1lIikpIA0KYGBgDQoNCiogRmFyYmVuIGbDvHIgUGFydGVpZW4gZGVmaW5pZXJlbg0KYGBge3J9DQpwYXJ0ZWlfZmFyYmVuIDwtIGxpc3QoDQogICJDRFUiID0gImJsYWNrIiwNCiAgIlNQRCIgPSAicmVkIiwNCiAgIkNTVSIgPSAiYmxhY2siLA0KICAiRkRQIiA9ICIjZTJiMDA3IiwNCiAgIkdSw5xORSIgPSAiIzA3QzIzRiIsDQogICJMSU5LRSIgPSAiI2RlNGM4YSIsIA0KICAiQWZEIiA9ICJibHVlIg0KKQ0KYGBgDQoNCiMjIE5ldHp3ZXJrDQoNClp1d2Vpc3VuZyB2b24gQXR0cmlidXRlbiBhbiBOb2RlczoNCiogUGFydGVpenVnZWjDtnJpZ2tlaXQgaW4gRmFyYmUNCiogS2xhcm5hbWUgZGVyIFBvbGl0aWtlcippbm5lbiBhbHMgTGFiZWwgDQoqIEFuemFobCBkZXIgVHdlZXRzIGluIEdyw7bDn2UNCmBgYHtyfQ0KbmV0el9wbG90IDwtIG5ldHogJT4lIA0KICBmaWx0ZXIoY29tcG9uZW50IDw9IDEwKSAlPiUgIA0KICBnZ3JhcGgobGF5b3V0ID0gImZyIikgKw0KICBnZW9tX2VkZ2VfbGluayhlZGdlX2NvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjI1LCBlZGdlX3dpZHRoID0gMC4xLCBlbmRfY2FwID0gY2lyY2xlKDIuNSwgIm1tIiksIGFycm93ID0gYXJyb3cobGVuZ3RoID0gdW5pdCgyLjUsICJtbSIpLCBlbmRzID0gICJsYXN0IiwgdHlwZSA9ICJjbG9zZWQiKSkgKw0KICBnZW9tX25vZGVfcG9pbnQoYWVzKHNpemUgPSBuLCBjb2xvciA9IFBhcnRlaSkpICsgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBwYXJ0ZWlfZmFyYmVuKSArDQogIHNjYWxlX3NpemUocmFuZ2UgPSBjKDEsIDgpKSArIA0KICB0aGVtZV9ncmFwaChiYWNrZ3JvdW5kID0gIndoaXRlIikgKw0KICBnZW9tX25vZGVfbGFiZWwoYWVzKGZpbHRlciA9IG4gPj0gNDAsIGxhYmVsID0gTmFtZSksIHJlcGVsID0gVCwgc2hvdy5sZWdlbmQgPSBGLCBhbHBoYSA9IDAuNSkgKw0KICBsYWJzKHRpdGxlID0gIlJldHdlZXQtTmV0endlcmtlIGRldXRzY2hlciBQb2xpdGlrZXIqaW5uZW4iLCBzaXplID0gIkFuemFobCBUd2VldHMiLCBzdWJ0aXRsZSA9ICJ6dW0gVGhlbWEgJ0dlbmRlcicgYWIgMjAxNiIpDQpgYGANCmBgYHtyfQ0KbmV0el9wbG90DQpgYGANCg0KIyBSZXR3ZWV0LU5ldHp3ZXJrZSBkZXV0c2NoZXIgUG9saXRpa2VyKmlubmVuIHp1bSBUaGVtYSBHZW5kZXINCg0KVW0gZGllIEFrdGl2aXTDpHQgZWluemVsbmVyIFBvbGl0aWtlcippbm5lbiB1bmQgaWhyZSBWZXJuZXR6dW5nIHVudGVyZWluYW5kZXIgaW4gRGViYXR0ZW4sIERpc2t1c3Npb25lbiwgTWVpbnVuZ3PDpHXDn2VydW5nZW4gdW5kIFN0ZWxsdW5nbmFobWVuIHp1bSBUaGVtYSBHZW5kZXIgYXVmIFR3aXR0ZXIgYWJ6dWJpbGRlbiwgd3VyZGUgc293b2hsIGRpZSBpbmRpdmlkdWVsbGUgQW56YWhsIGRlciBUd2VldHMgenVtIFRoZW1hIGFscyBhdWNoIGlocmUgZ2VnZW5zZWl0aWdlIEJlenVnbmFobWUgYXVmZWluYW5kZXIgaW4gRm9ybSB2b24gUmV0d2VldHMgdW50ZXJzdWNodC4gRGllc2UgSW5mb3JtYXRpb25lbiB3dXJkZW4gaW4gZWluZW0gTmV0endlcmtkaWFncmFtbSBkYXJnZXN0ZWxsdC4gDQoNCkRpZSBzbyBlbnRzdGFuZGVuZW4gUmV0d2VldC1OZXR6d2Vya2Ugd3VyZGVuIGF1cyBkZW4gbGV0enRlbiAxLjAwMCBUd2VldHMgZGVyamVuaWdlbiBBYmdlb3JkbmV0ZW4sIHdlbGNoZSDDvGJlciBlaW5lbiBUd2l0dGVyLUFjY291bnQgdmVyZsO8Z2VuIHVuZCBzaWNoIGluIGRpZXNlbiBsZXR6dGVuIDEuMDAwIFR3ZWV0cyBtaW5kZXN0ZW5zIGVpbm1hbCB6dW0gVGhlbWEgR2VuZGVyIMOkdcOfZXJ0ZW4sIGdlbmVyaWVydC4gRGVyIMOkbHRlc3RlIG1pdGVpbmJlem9nZW5lIFR3ZWV0IHp1bSBUaGVtYSB3dXJkZSBpbSBBdWd1c3QgMjAxNiBhYmdlc2V0enQuIERlbm5vY2ggZGVja3QgZGllc2UgTmV0endlcmthbmFseXNlIG5pY2h0IGRpZSBUd2l0dGVyLUFrdGl2aXTDpHQgYWxsZXIgdW50ZXJzdWNodGVuIFBvbGl0aWtlcippbm5lbiBiaXMgenVyw7xjayB6dSBkaWVzZW0gWmVpdHB1bmt0IGFiLiBHcnVuZCBoaWVyZsO8ciBpc3QsIGRhc3MgZWluaWdlIFBvbGl0aWtlcjppbm5lbiwgZ2VtZXNzZW4gYW4gZGVyIEZyZXF1ZW56LCBpbiBkZXIgc2llIFR3ZWV0cyBhYnNldHplbiwgZWluZSB2ZXJnbGVpY2hzd2Vpc2UgaG9oZSBBa3Rpdml0w6R0IGF1ZiBUd2l0dGVyIGF1ZndlaXNlbiwgd2Vzd2VnZW4gaWhyZSBsZXR6dGVuIDEuMDAwIFR3ZWV0cyBuaWNodCBiaXMgaW4gZGVuIEF1Z3VzdCAyMDE2IHp1csO8Y2tyZWljaGVuLiAgDQoNCkRpZSBQdW5rdGUgaW4gZGVyIEdyYWZpayBzdGVsbGVuIGVpbnplbG5lIEFiZ2VvcmRuZXRlIGRhci4gRGllIEdyw7bDn2UgZGVzIGpld2VpbGlnZW4gUHVua3RlcyB2ZXJhbnNjaGF1bGljaHQgZGllIEFuemFobCBkZXIgdm9uIGRlci9kZW0gQWJnZW9yZG5ldGVuIGFiZ2VzZXR6dGVuIFR3ZWV0cyB6dW0gVGhlbWEgR2VuZGVyIHVuZCBnaWJ0IHNvbWl0IEF1ZnNjaGx1c3Mgw7xiZXIgZWluZSBldmVudHVlbGxlIFNjaHdlcnB1bmt0c2V0enVuZyBkZXIvZGVzIEFiZ2VvcmRuZXRlbi4gWnVzw6R0emxpY2ggd3VyZGVuIGRpZSBOYW1lbiBkZXIgQWJnZW9yZG5ldGVuIG1pdCA0MCB1bmQgbWVociBUd2VldHMgenVtIFRoZW1hIGVpbmdlYmxlbmRldC4gRWluZSBWZXJiaW5kdW5nIHp3aXNjaGVuIHp3ZWkgUHVua3RlbiBzdGVsbHQgZWluZW4gVHdlZXQgZGFyLCBkZXIgZ2VyZXR3ZWV0ZXQgd3VyZGUuIERhYmVpIGVudHNwcmluZ3QgZGVyIFBmZWlsIGJlaSBkZXIvZGVtIHJldHdlZXRlbmRlbiBBYmdlb3JkbmV0ZW4gdW5kIHdlaXN0IGF1ZiBkaWUvZGVuIEFiZ2VvcmRuZXRlbiwgdm9uIGRlci9kZW0gZGVyIG9yaWdpbsOkcmUgVHdlZXQgc3RhbW10LiBHZWhlbiBtZWhyZXJlIFBmZWlsZSB2b24gZWluZW0gUHVua3QgYXVzLCBoYXQgZGVyL2RpZSBlbnRzcHJlY2hlbmRlIEFiZ2VvcmRuZXRlIG1laHJlcmUgVHdlZXRzIGFuZGVyZXIgQWJnZW9yZG5ldGVyIGdlcmV0d2VldGV0LiBXZWlzZW4gbWVocmVyZSBQZmVpbGUgYXVmIGVpbmVuIFB1bmt0LCBzbyB3dXJkZSBkZXIvZGllIGVudHNwcmVjaGVuZGUgQWJnZW9yZG5ldGUgbWVocmZhY2ggdm9uIGFuZGVyZW4gQWJnZW9yZG5ldGVuIGdlcmV0d2VldGV0LiBad2lzY2hlbiB6d2VpIFB1bmt0ZW4ga2FubiBtZWhyIGFscyBlaW5lIFZlcmJpbmR1bmcgYmVzdGVoZW4uIERpZSBGYXJiZSBkZXIgUHVua3RlIHN5bWJvbGlzaWVydCBkaWUgUGFydGVpenVnZWjDtnJpZ2tlaXQgZGVyIEFiZ2VvcmRuZXRlbi4gIA0KDQpJbiBkZXIgR3JhZmlrIHNpbmQgbWVocmVyZSBuaWNodCBtaXRlaW5hbmRlciB2ZXJidW5kZW5lIE5ldHp3ZXJrc3RydWt0dXJlbiB6dSBlcmtlbm5lbi4gU2luZCBQdW5rdGUgaW4ga2VpbmVyIFdlaXNlIGR1cmNoIFZlcmJpbmR1bmdzbGluaWVuIG1pdGVpbmFuZGVyIHZlcmtuw7xwZnQsIHNvIG5laG1lbiBkaWUgQWJnZW9yZG5ldGVuIGluIGlocmVuIGVudHNwcmVjaGVuZGVuIFR3ZWV0cyBrZWluZW4gQmV6dWcsIG9kZXIgenVtaW5kZXN0IGtlaW5lcmxlaSBCZXp1ZyBpbiBGb3JtIHZvbiBSZXR3ZWV0cywgYXVmZWluYW5kZXIuICANCg0KRGFzIFZlcmjDpGx0bmlzIGRlciBlaW56ZWxuZW4gTmV0endlcmtlIHp1ZWluYW5kZXIgaXN0IGRhaGVyIGZvbGdlbmRlcm1hw59lbiB6dSBiZXNjaHJlaWJlbjogWndhciBrw7ZubmVuIGRpZSBuaWNodCBtaXRlaW5hbmRlciB2ZXJrbsO8cGZ0ZW4gS29tbXVuaWthdGlvbnNrZXR0ZW4gZGVuIGdsZWljaGVuIEFubGFzcyB6dW0gVGhlbWEgaGFiZW4sIHdlaWwgc2llIHouQi4gaW4gZGVyIGdsZWljaGVuIERlYmF0dGUgZW50c3RhbmRlbiBzaW5kIChvaG5lIGRhc3MgZGFiZWkgVmVya27DvHBmdW5nZW4gZHVyY2ggUmV0d2VldHMgZW50c3RhbmRlbiBzaW5kKSwgc2llIGvDtm5uZW4gamVkb2NoIGF1Y2ggenUgYW5kZXJlbiBaZWl0cHVua3RlbiB1bmQgQW5sw6Rzc2VuIGVudHN0YW5kZW4gc2Vpbiwgd29taXQgc2llIGluIGtlaW5lbSBkaXJla3RlbiBadXNhbW1lbmhhbmcgenVlaW5hbmRlciBzdMO8bmRlbi4gV2FzIHNpZSB2ZXJiaW5kZXQsIGlzdCBkYXNzIHNpZSBkYXMgS29tbXVuaWthdGlvbnN2ZXJoYWx0ZW4gdW5kIGRpZSBWZXJuZXR6dW5nc3N0cnVrdHVyZW4gdm9uIEJ1bmRlc3RhZ3MtIHVuZCBMYW5kdGFnc2FiZ2VvcmRuZXRlbiBhdWYgVHdpdHRlciB6dW0gVGhlbWEgR2VuZGVyLCB3ZWxjaGVzIGR1cmNoIGRpZSA0NyBTdWNoYmVncmlmZmUgKHNpZWhlIFNlbnRpbWVudGFuYWx5c2UpIGVyc2NobG9zc2VuIHd1cmRlLCBkYXJzdGVsbGVuLiAgDQoNCkVzIGbDpGxsdCBhdWYsIGRhc3MgQWJnZW9yZG5ldGUgZGVyIFBhcnRlaWVuIEdyw7xuZSB1bmQgRGllIExpbmtlIGJlc29uZGVycyBzdGFyayBpbiBkZW4gTmV0endlcmtzdHJ1a3R1cmVuIHZlcnRyZXRlbiBzaW5kLiBGw7xyIGFsbGUgUGFydGVpZW4gaXN0IGZlc3R6dXN0ZWxsZW4sIGRhc3MgZGllIEFiZ2VvcmRuZXRlbiBzaWNoIHp1bSBHcm/Dn3RlaWwgcGFydGVpaW50ZXJuIHJldHdlZXRlbiB1bmQgdm9tIFJldHdlZXRlbiBBYmdlb3JkbmV0ZXIgYW5kZXJlciBQYXJ0ZWllbiBlaGVyIGFic2VoZW4uIERhYmVpIHN0ZWNoZW4gZXJuZXV0IGRpZSBQYXJ0ZWllbiBHcsO8bmUgdW5kIERpZSBMaW5rZSBkdXJjaCBlaW5lIGV0d2FzIHN0w6Rya2VyZSDDvGJlcnBhcnRlaWxpY2hlIFZlcm5ldHp1bmcgYmVzb25kZXJzIHVudGVyZWluYW5kZXIgaGVydm9yLiBBdWNoIEFiZ2VvcmRuZXRlIGRlciBDRFUgbmVobWVuIHZlcmVpbnplbHQgQmV6dWcgYXVmIEFiZ2VvcmRuZXRlIGFuZGVyZXIgUGFydGVpZW4uIFdvYmVpIHNvd29obCBiZWkgaWhyIGFscyBhdWNoIGJlaSBkZXIgU1BEIGRpZSB2ZXJow6RsdG5pc23DpMOfaWcgZ2VyaW5nZSBQcsOkc2VueiBpbiBkZXIgU3VtbWUgZGVyIE5ldHp3ZXJrZSBhdWZmw6RsbHQuIEJlaSBGRFAgdW5kIEFmRCBoaW5nZWdlbiBmw6RsbHQgZGllIElzb2xhdGlvbiBpaHJlciBOZXR6d2Vya2Ugdm9tIFJlc3QgZGVyIE5ldHp3ZXJrc3RydWt0dXJlbiBhdWYuIFfDpGhyZW5kIGRpZSBGRFAgZGFiZWkgamVkb2NoIHZlcmjDpGx0bmlzbcOkw59pZyBzdGFya2UgaW5uZXJwYXJ0ZWlsaWNoZSBWZXJrbsO8cGZ1bmdlbiBhdWZ3ZWlzdCwgc2luZCBkaWUgTmV0endlcmtlIGRlciBBZkQgZWhlciB2b25laW5hbmRlciBpc29saWVydC4gDQoNCiMgWnVzYW1tZW5mYXNzdW5nIGRlciBFcmdlYm5pc3NlIA0KDQpadXNhbW1lbmZhc3NlbmQgaGF0IGRpZSBBbmFseXNlIGdlemVpZ3QsIGRhc3MgZXMgZWluZSBEaXNrcmVwYW56IHp3aXNjaGVuIGRlciByZWFsZW4gR2VzY2hsZWNodGVydmVydGVpbHVuZyBpbiBkZXIgR2VzZWxsc2NoYWZ0IHVuZCBkZXIgVmVydGVpbHVuZyBpbiBkZXIgUmVwcsOkc2VudGF0aW9uIGR1cmNoIGRpZSBBYmdlb3JkbmV0ZW4gZ2lidC4gIA0KDQpBdWNoIGlubmVyaGFsYiBkZXIgUGFydGVpZW4gc3BpZWx0IGRhcyBUaGVtYSBHZW5kZXIgZWluZSB1bnRlcnNjaGllZGxpY2ggZ3Jvw59lIFJvbGxlLiBEaWUgRnJha3Rpb25lbiBkZXIgUGFydGVpZW4gR3LDvG5lIHVuZCBEaWUgTGlua2UgaGFiZW4gZGVuIHZlcmjDpGx0bmlzbcOkw59pZyBncsO2w590ZW4gRnJhdWVuYW50ZWlsLiBJbiBkZXIgTmV0endlcmthbmFseXNlIHplaWd0IHNpY2gsIGRhc3MgZWJlbmZhbGxzIGRpZXNlIGJlaWRlbiBQYXJ0ZWllbiBzZWhyIGFrdGl2IGFuIGRlbSBUaGVtYSBiZXRlaWxpZ3Qgc2luZC4gIA0KDQpEaWUgU2VudGltZW50LUFuYWx5c2UgaGF0IGdlemVpZ3QsIGRhc3Mgc2ljaCBkaWUgRnJha3Rpb25lbiBBZkQgdW5kIERpZSBMaW5rZSB6dSA1MCUgbmVnYXRpdiB1bmQgNTAlIHBvc2l0aXYgenUgZGVtIFRoZW1hIGF1ZiBUd2l0dGVyIMOkdcOfZXJuLiBEaWUgYW5kZXJlbiBmw7xuZiBQYXJ0ZWllbiBtZWxkZW4gc2ljaCBlaGVyIHBvc2l0aXYuICA=